结构的内存对齐

时间:2012-02-13 03:47:02

标签: c memory alignment intel

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

我不明白为什么你的编译器想要填充unsigned int成员,假设你没有unsigned int不是32位的奇怪设置。在我的海湾合作委员会上,我得到sizeof(struct tmp) == 16

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

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