填充物如何有益?

时间:2014-02-06 14:39:14

标签: c structure padding

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

以上struct将自动“填充”。但我不明白'填充'是如何有益的。

4 个答案:

答案 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