struct MixedData
{
char Data1;
short Data2;
short Data3;
double Data4;
int Data5;
double Data6;
};
以上struct
将自动“填充”。但我不明白'填充'是如何有益的。
答案 0 :(得分:4)
在某些CPU架构上,尝试从未对齐的内存地址加载字可能需要很多CPU周期,而从对齐的地址加载字会占用很少的CPU周期。某些CPU架构甚至无法从未对齐的地址加载。
编译器非常有用,可以尝试将结构成员变量放在CPU的最佳位置。
答案 1 :(得分:4)
某些计算机(例如RISC,并且一次基于ARM)只能在特定内存边界访问double
。其他计算机,例如基于8086的系列,可以进行任意访问,但性能会受到影响。
答案 2 :(得分:4)
因为大多数平台在读取未对齐数据时会遭受性能损失。例如,只要正确对齐,64位宽的存储器控制器就可以在一个“周期”中读取double
,如果没有,则需要2个周期来读取它并不必要地加载MC。有些平台甚至无法读取未对齐的数据。这就是为什么填充必须确保一切都达到最佳状态。
答案 3 :(得分:3)
只是扩展已经通过视觉表示给出的答案。
当一个单词在内存中对齐时,它看起来像这样,只需要一次阅读。
+-------------------------+-------------------------+
| XX XX XX XX XX XX XX XX | 12 34 56 78 90 ab cd ef |
+-------------------------+-------------------------+
^-----------------------^
Cycle 1
当它未对齐时,某些体系结构需要两个周期来获取该字,因为它不能一次读取边界或者内存地址在内部表示为字大小的倍数。他们需要获取两倍的数据量,丢弃无用的部分并组合有用的部分来形成单词。
+-------------------------+-------------------------+
| XX XX XX XX XX 12 34 56 | 78 90 ab cd ef XX XX XX |
+-------------------------+-------------------------+
^--------^ ^--------------^
Cycle 1 Cycle 2