C ++中struct的对齐方式

时间:2014-03-19 19:58:25

标签: c++ memory-alignment

范围在x86中 例如,我们有一个像这样的结构:

struct X{
   int    a;   
   char   b; 
               // compiler will pad 3 bytes here
   double c;
};
X x;

我认为x的对齐应该是其中最大的成员,在这种情况下是 double 8 字节,
所以&x应该是 8 的倍数,我是对的吗?

然而,经过一些测试,我的编译器(msvc 2013)说&x也可以是 4 的倍数,但不是 8

是不是意味着&x.c也会是 4 的倍数?

我在哪里误会?

3 个答案:

答案 0 :(得分:3)

C和C ++标准没有给出任何对齐的建议[或至少没有确定的规则]。由每个编译器决定(当然,编译器的目标是什么)来确定一个好的策略。如果此政策适用于目标......;)

,通常会优先考虑

由于x86的FPU [包括scalar模式中的SSE]可以读取" double"从任何字节地址开始,我相信在bc元素之间添加超过3个字节没有直接的好处,也没有将整个结构对齐到超过4个字节的任何内容。做更多会浪费记忆力。

在其他一些架构中,它可能是一个很大的好处(或者要求目标正确运行),因此它会将整个struct与8个字节对齐。

答案 1 :(得分:1)

VC中的结构对齐是编译器选项/ Zp确定将打包结构的字节边界。这通常是一个高级选项,除了在异常使用情况下(例如通过网络传输块数据的memcpy)之外不使用。 检查项目的属性页以查看对齐方式。

http://msdn.microsoft.com/en-us/library/xh3e3fd0.aspx

答案 2 :(得分:1)

一般来说,你不能说出大小,对齐方式或你struct的包装方式,以及通常"通常"我的意思是根据您选择的C ++标准。

问题是:

  • intchardouble根据标准the standard simply sets some minimum requirements没有定义的大小,您将获得的内容取决于实施
  • 对齐不仅取决于编译器的实现,有时甚至取决于你传递的标志集和你所针对的硬件,打包对CPU缓存非常重要,有些指令甚至可能需要不同的填充,这也取决于关于你在struct中所写的内容以及你是如何写作的。

作为此类操作的结果,您必须坚持使用所选编译器的文档并深入了解它为您提供的功能,例如,您可以在此处找到how to pack data in gcc vs msvc的概述。