[英]alignment of struct in C++
范围在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的倍数?
我在哪里误会?
C和C ++标准没有给出任何对齐的建议[或至少没有确定的规则]。 由每个编译器决定(当然,编译器的目标是什么)来确定一个好的策略。 如果此政策适用于目标,通常是首选......;)
由于x86的FPU [包括标量模式下的SSE]可以从任何字节地址读取“double”,我相信在b
和c
元素之间添加超过3个字节没有直接好处,也没有将整个结构对齐到超过4个字节的任何东西。 做更多会浪费记忆力。
在一些其他架构中,它可能是一个很大的好处(或者目标正确运行的要求),因此它将整个struct
对齐到8个字节。
VC中的结构对齐是编译器选项/ Zp确定将打包结构的字节边界。 这通常是一个高级选项,除了在异常使用情况下(例如通过网络传输块数据的memcpy)之外不使用。 检查项目的属性页以查看对齐方式。
一般来说,你不能说大小,对齐或你的struct
如何打包,并且“通常”我的意思是根据你选择的C ++标准。
问题是:
int
, char
和double
没有根据标准定义的大小, 标准只是设置了一些最低要求 ,你将得到什么取决于实现 struct
以及如何编写它。 作为这种操作的结果,您必须坚持使用您选择的编译器的文档并深入了解它为您提供的功能,例如,您可以在此处找到有关如何在gcc
与msvc
打包数据的概述。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.