【发布时间】:2012-08-07 00:06:06
【问题描述】:
typedef struct structc_tag
{
char c;
double d;
int s;
} structc_t;
我在一篇博客中读到这将占用 24 个字节的数据:
sizeof(char) + 7 字节填充 + sizeof(double) + sizeof(int) + 4 字节填充 = 1 + 7 + 8 + 4 + 4 = 24 字节。
我的问题是为什么要使用 7 字节的填充,为什么我们不能在那里使用 3 字节的填充并利用接下来的 8 字节进行加倍?最后 4 个字节需要什么?
【问题讨论】:
-
double实体应与可被 8 整除的地址对齐,否则 FPU 在尝试从内存中加载值时可能会变得不高兴。在这种情况下必须发出非常慢的未对齐加载(并且某些平台根本不支持未对齐访问)。在 x64 CPU 上的 64 位模式下尤其如此,其中数学主要使用 SSE 完成。最后四个字节用于确保在一个接一个地堆叠许多此类结构时正确对齐(例如,在struct_t的数组中)。 -
通常很难确切知道结构或对象在实际实现中的大小,因为它在您使用的每个平台上都会发生变化。您通常应该只依靠编译器来尽其所能使用所需的字段并根据需要填充以获得最佳性能。这就是人们在检查对象使用的字节数时使用
sizeof()的原因——即使对于像 int 这样的原语也是如此。 -
如果可以的话,只需根据字段的大小对字段进行排序,在您的情况下,这可能对大多数平台都有帮助
标签: c memory-management struct