C 64位指针对齐

问题描述:

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

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

struct a { 
    void* ptr; 
    char myChar; 
} 

请问指针由8字节对齐,导致7个字节的填充的字符(总共= 8 + 8 = 16)?或者指针是4字节对齐的(4字节+ 4字节),导致3字节的填充(总数= 4 + 4 + 4 = 12)?

感谢, 瑞安

+7

一会儿,我读了“C64”。 – Thilo 2010-03-24 07:15:43

数据对齐和打包是特定于实现的,通常可以从编译器设置(甚至是编译指示)进行更改。假设你使用的是默认设置,那么在大多数(如果不是全部的话)编译器上,结构最终应该总共为16个字节。原因是因为计算机读取的数据块大小与原始字大小相同(在64位系统中为8字节)。如果将它填充到4个字节的偏移量,下一个结构将不会被正确地填充到64位边界。例如,在arr [2]的情况下,数组的第二个元素将以12字节偏移量开始,该偏移量不在机器的本地字节边界处。

我不认为你可以依靠任何坚硬和快速的规则。我认为这是你使用的编译器和你选择的编译选项的功能。

最好的办法是编写一个测试程序,并将头文件中的对齐规则编码为#define s。您也可以在宏中正确计算您感兴趣的内容。

通常在64位系统

struct a { 
    void* ptr;  // size is 8 bytes, alignment is 8 
    char myChar; // size is 1 byte, alignment is 1 
        // padding of 7 bytes so array elements will be properly aligned 
} 

对于16个字节的总大小。

但是,这是所有的实现定义 - 我只是举一个例子,很多(大多数?)64位系统可能是真实的。

您需要查阅您感兴趣的特定ABI的文档。例如,这里是the System V ABI x86-64 architeture supplement - 您可以在第12页看到关于这个ABI的指针是8字节对齐的(所以是的,你的结构显示将被填充到16个字节)。

语言标准没有声明填充。对齐规则是特定于平台的(即,您必须在PowerPC CPU上比x86_64 CPU上的对齐方式不同),并且它们是实现定义的,这意味着您的编译器可以执行任何操作(并且可以使用不同的命令更改该行为在线选项或版本更新后)。

我坚信线沿线的任何推荐“这是通常这个或那个”是误导性的,并可能是危险的。

  1. 你可以编写一个执行几个sizeof()和/或offsetof()语句,并为您含有一些#define小号,说明使用的垫衬写头的测试程序。

  2. 您可以使用autoconf为您做到这一点。

  3. 最起码,您应该在main()函数的开头添加assert(sizeof(...))声明,以便在您的假设错误时得到通知。