为什么青睐的数据结构对齐?(Why favour data structure alignment?

2019-07-30 00:40发布

的类型的结构的每个成员的通常具有ieeach结构构件由预先确定的边界上对齐的默认取向。 由于这个原因,填充在以下维基例子进行的:

struct MixedData
{
    char Data1;
    short Data2;
    int Data3;
    char Data4;
};



struct MixedData  /* After compilation in 32-bit x86 machine */
{
    char Data1; /* 1 byte */
    /* 1 byte for the following 'short' to be aligned on a 2 byte boundary 
assuming that the address where structure begins is an even number */
    char Padding1[1];
    short Data2; /* 2 bytes */
    int Data3;  /* 4 bytes - largest structure member */
    char Data4; /* 1 byte */
    char Padding2[3]; /* 3 bytes to make total size of the structure 12 bytes */
};

什么是(实用)的原因,对准应该保留?

Answer 1:

未对齐的读取和写入通常需要CPU从存储器(而不是仅仅一个)取两个相邻字,并且为了适当地执行指定操作应用一些附加的按位算术。

一些架构,像86将允许它在性能上的开销。 其他架构(最明显的是ARM),要么抛出一个异常(通常导致SIGBUS信号的用户进程),甚至是“圆”的地址,这可能会导致一些非常讨厌的错误最接近的边界。



Answer 2:

在很多平台上,对齐从中读取和写入主内存比他们的同行不对齐快得多。



Answer 3:

通常情况下,结构上的处理器依赖对准对齐以使使用该处理器的“自然”寄存器大小访问它们尽可能快。

对于32位处理器,它是4个字节(或32位),对于64位处理器是8个字节。

如果您尝试访问(比如)一个int,如果它不正确的边界上对齐的一些(非x86)的处理器将产生故障。

不同设备之间的通信是一个实际的原因以保持对准。 用默认的对齐,这种结构将是24个字节长,而在64位处理器上,这将是48个字节,并且除了第一项的非是在同一个地方。

它通常是可以改变与可以否定在您的示例中指定的手动填充所述有此需要的编译器/ pragma指令的结构填料,但是这通常对于每个编译器不同。



文章来源: Why favour data structure alignment?