gpt4 book ai didi

c - 结构的内存对齐

转载 作者:太空宇宙 更新时间:2023-11-03 23:55:19 37 4
gpt4 key购买 nike

我有一个结构,其中三个字段定义如下:

struct tmp {
char *ptr;
unsigned int data1;
unsigned int data2;
};

在使用 Intel sandybridge 处理器的 64 位系统上使用 GCC 编译后,sizeof(tmp) 返回 24。

据我了解,编译器将 4 个字节填充到两个“unsigned int”字段。但是,如果没有填充并且生成的结构大小为 16 会更好吗?

想象一下,如果有一个这样的结构数组,通过强制该结构的大小为 16 将确保数组中没有单个结构被拆分为缓存行,因为英特尔的缓存行大小为 64 字节SandyBridge 处理器。因此减少了在遍历数组时通过两次内存访问来获取此类结构的机会。

最佳答案

我不明白为什么你的编译器想要填充 unsigned int 成员,假设你没有一些奇怪的设置,其中 unsigned int 不是 32 -少量。在我的 GCC 上,我得到 sizeof(struct tmp) == 16

如果您打印出每个成员的地址会怎样?那应该可以帮助您找出填充的位置。但无论如何,您应该能够通过告诉 GCC 打包结构来摆脱填充,如下所示:

struct tmp {
char *ptr;
unsigned int data1;
unsigned int data2;
} __attribute__((packed));

关于c - 结构的内存对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9255342/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com