C 64位指针对齐

Dun*_*Bug 11 c 64-bit alignment

64位系统上的指针是否仍然是4字节对齐(类似于32位系统上的双精度)?或者他们注意到8字节对齐?

例如,在64位系统上,以下数据结构有多大:

struct a {
    void* ptr;
    char myChar;
}
Run Code Online (Sandbox Code Playgroud)

指针是否会被8字节对齐,导致字符的填充为7个字节(总计= 8 + 8 = 16)?或者指针是4字节对齐(4字节+4字节)导致3个字节的填充(总计= 4 + 4 + 4 = 12)?

谢谢,瑞恩

小智 6

我认为你不能依赖任何严格的规则.我认为这是您使用的编译器和您选择的编译选项的功能.

最好的办法是编写一个程序来测试这个并吐出一个头文件,将对齐规则编成#defines.您也可以在宏中计算您感兴趣的内容.


rek*_*o_t 6

数据对齐和打包是特定于实现的,通常可以从编译器设置(甚至是编译指示)进行更改.

但是假设您使用默认设置,在大多数(如果不是全部)编译器上,结构总共应该是16个字节.原因是计算机读取的数据块大小为其本机字大小(在64位系统中为8个字节).如果要将其填充到4字节偏移量,则下一个结构将无法正确填充到64位边界.例如,在arr [2]的情况下,数组的第二个元素将以12字节偏移量开始,该偏移量不在机器的本地字节边界处.