繁体   English   中英

为什么支持数据结构对齐?

[英]Why favour data structure alignment?

结构的每个成员的类型通常都有一个默认的对齐方式,即每个结构成员都在预先确定的边界上对齐。 出于这个原因,填充在以下 wiki 示例中执行:

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 */
};

应该保留对齐的(实际)原因是什么?

在许多体系结构上,从主内存到对齐的读取和写入比未对齐的对应物快得多。

未对齐的读取和写入通常需要 CPU 从内存中获取两个相邻的字(而不是一个),并应用一些额外的按位算术以正确执行指定的操作。

某些体系结构,例如 x86,将以性能成本为代价。 其他体系结构(最著名的是 ARM)将引发异常(通常导致用户进程的SIGBUS信号),或者甚至将地址“四舍五入”到最近的边界,这可能会导致一些非常讨厌的错误。

通常,结构在依赖于处理器的对齐方式上对齐,以便使用处理器的“自然”寄存器大小尽可能快地访问它们。

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

某些(非 x86)处理器会在您尝试访问(比如)一个 int 时产生错误,如果它没有在正确的边界上对齐。

不同设备之间的通信是保持对齐的实际原因。 在默认对齐情况下,此结构的长度为 24 字节,而在 64 位处理器上,则为 48 字节,并且除第一个之外的所有项目都不会在同一位置。

通常可以使用编译器/pragma 指令更改结构填充,这可能不需要您的示例中指定的手动填充,但这通常因每个编译器而异。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM