范围在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 的倍数?
我在哪里误会?
答案 0 :(得分:3)
C和C ++标准没有给出任何对齐的建议[或至少没有确定的规则]。由每个编译器决定(当然,编译器的目标是什么)来确定一个好的策略。如果此政策适用于目标......;)
,通常会优先考虑由于x86的FPU [包括scalar模式中的SSE]可以读取" double"从任何字节地址开始,我相信在b
和c
元素之间添加超过3个字节没有直接的好处,也没有将整个结构对齐到超过4个字节的任何内容。做更多会浪费记忆力。
在其他一些架构中,它可能是一个很大的好处(或者要求目标正确运行),因此它会将整个struct
与8个字节对齐。
答案 1 :(得分:1)
VC中的结构对齐是编译器选项/ Zp确定将打包结构的字节边界。这通常是一个高级选项,除了在异常使用情况下(例如通过网络传输块数据的memcpy)之外不使用。 检查项目的属性页以查看对齐方式。
答案 2 :(得分:1)
一般来说,你不能说出大小,对齐方式或你struct
的包装方式,以及通常"通常"我的意思是根据您选择的C ++标准。
问题是:
int
,char
和double
根据标准the standard simply sets some minimum requirements没有定义的大小,您将获得的内容取决于实施struct
中所写的内容以及你是如何写作的。作为此类操作的结果,您必须坚持使用所选编译器的文档并深入了解它为您提供的功能,例如,您可以在此处找到how to pack data in gcc
vs msvc
的概述。