typedef struct structc_tag
{
char c;
double d;
int s;
} structc_t;
我在博客中读取,这将取数据的24个字节:混乱在结构成员对齐
的sizeof(char)的+ 7字节的填充+的sizeof(双)+的sizeof(int)的+ 4字节填充= 1 + 7 + 8 + 4 + 4 = 24字节。
我的问题是为什么7字节的填充,为什么我们不能在那里使用3字节的填充,并利用接下来的8字节来加倍?最后4个字节需要什么?
'double'实体应该对齐到可被8整除的地址,否则当试图从内存加载值时,FPU可能会变得不快乐。在这种情况下,必须发出非常慢的未对齐负载(并且某些平台根本不支持未对齐的访问)。在x64 CPU上的64位模式下尤其如此,其中数学主要使用SSE完成。最后四个字节用于保证在堆叠多个这样的结构时(例如,在一个'struct_t'数组中),正确对齐。 – 2012-08-09 17:41:21
通常很难确切知道实际实现中结构或对象的大小,因为它在您使用的每个平台上都会发生变化。您通常只需依靠编译器尽其所能地完成必要的字段和填充以获得最佳性能。这就是为什么人们在检查对象使用的字节数时使用'sizeof()'的原因 - 即使是像int这样的基本类型。 – Pyrce 2012-08-09 17:43:17
如果你愿意,只需根据它们的大小对字段进行排序,就你的情况而言,这可能对大多数平台有所帮助 – 2012-08-09 18:25:57