【发布时间】:2022-02-05 23:01:57
【问题描述】:
大多数处理器架构更喜欢自然对齐作为默认对齐要求,但我认为处理器字对齐是一种更有效的对齐要求,它可以节省内存,而不会比自然对齐带来任何性能开销。
例如,根据自然对齐,双精度数的对齐方式为 8,但在 32 位处理器上,如果双精度数的对齐方式为 4,它将没有性能开销,并且可以节省内存。 source#3.6.4 声明 double 在 32 位处理器上对齐为 8:
对齐 64 位数据,使其基地址为 8 的倍数。
类似的例子可以在 64 位处理器中看到,16 字节大小的数据类型(int128)的对齐为 16,而保持对齐等于处理器字的大小(即 8 字节)可能是有益的long 在 64 位处理器中)。
我的猜测是创建这个自然对齐标准是因为当直接从网络中读取数据时,机器可以默认为自然对齐,而不必根据 CPU 架构来处理相同数据类型的不同对齐。数据的发送者。
当数据结构的所有字段都存储在单个 CPU 字中时,由于自然对齐,它们内部仍然有填充,而我认为当所有字段都存储在单个 CPU 字中时不需要填充,因为结构的任何字段都需要相同数量的字节移位来访问它,而不管它存储在 CPU 字的哪个位置(如果我错了,请纠正我)。
例如,考虑这个结构:
struct example {
char i; // 1 byte
// 1 byte padding
short j; // 2 bytes
int k; // 4 bytes
char l; // 1 byte
// 3 bytes trailing padding
} foo;
我认为foo.i 和foo.j 之间不需要填充,因为foo.j 仍然需要6 字节移位才能访问。
总结一下我的问题,我想知道自然对齐相对于基于处理器字的对齐有什么好处。
我还想知道在存储所有数据的 CPU 字之间插入填充是否比在没有任何填充的情况下存储这些字段更好。还有,同一个CPU word中字段的位置有区别吗?
【问题讨论】:
标签: struct cpu padding cpu-architecture memory-alignment