C 填充有什么好处?

C 填充有什么好处?,c,structure,padding,C,Structure,Padding,上述struct将自动“填充”。但我不明白“填充”有什么好处。在某些CPU体系结构上,尝试从未对齐的内存地址加载一个字可能需要很多CPU周期,而从对齐的地址加载一个字则需要很少的CPU周期。一些CPU架构甚至不能从未对齐的地址加载 编译器很有帮助,可以尝试将结构成员变量放置在CPU的最佳位置。某些计算机(例如RISC,以及基于ARM的计算机)只能在特定内存边界上访问,比如说,double。其他计算机,如基于8086系列的计算机,可以进行任意访问,但会造成性能损失。因为大多数平台在读取未对齐的数据

上述
struct
将自动“填充”。但我不明白“填充”有什么好处。

在某些CPU体系结构上,尝试从未对齐的内存地址加载一个字可能需要很多CPU周期,而从对齐的地址加载一个字则需要很少的CPU周期。一些CPU架构甚至不能从未对齐的地址加载


编译器很有帮助,可以尝试将结构成员变量放置在CPU的最佳位置。

某些计算机(例如RISC,以及基于ARM的计算机)只能在特定内存边界上访问,比如说,double。其他计算机,如基于8086系列的计算机,可以进行任意访问,但会造成性能损失。

因为大多数平台在读取未对齐的数据时会受到性能损失。例如,一个64位宽的内存控制器可以在一个“周期”内读取一个
double
,只要它正确对齐,否则将需要2个周期来读取它并不必要地加载MC。一些平台甚至无法读取未对齐的数据。这就是为什么填充是必须的,以确保所有内容都以最佳方式对齐。

只需在已经给出的答案上用视觉表示进行扩展即可

当一个单词在内存中对齐时,它看起来是这样的,并且只需要一次读取

struct MixedData
{
    char Data1;
    short Data2;
    short Data3;
    double Data4;
    int Data5;
    double Data6;
};
当它未对齐时,一些架构需要两个周期来获取字,因为它不能一次读取超过边界的内容,或者内存地址在内部表示为字大小的倍数。他们需要提取两倍的数据量,丢弃无用的部分,并将有用的部分组合成单词

+-------------------------+-------------------------+
| XX XX XX XX XX XX XX XX | 12 34 56 78 90 ab cd ef |
+-------------------------+-------------------------+
                           ^-----------------------^
                                     Cycle 1

周期
指的是什么?@kevingomes-如果您的CPU以2 GHz的速度运行,这意味着它以每秒20亿个周期的速度运行,那么这就是一个周期。为什么未对齐的内存需要更多的周期?但我想知道为什么大多数平台在读取未对齐的数据时会受到性能损失。另外,正如您所写的
一个64位宽的内存控制器可以在一个“周期”内读取一个双精度内存,只要它正确对齐,如果没有对齐,则需要2个周期来读取它并不必要地加载MC
,为什么会发生这种情况?@kevingomes-因为MC本身可以访问其宽度的多个内存地址。例如,64位MC可以读取地址0、64、128等。如果64位数据在64位边界上对齐,MC将一次性读取所有64位,如果未对齐,内存控制器将读取一个64位数据块,从中提取数据,读取下一个数据块以提取其余数据,并可能执行移位和屏蔽操作,以将两个数据块组合成一个64位数据类型。
64位边界
是什么意思?这意味着地址是8字节的倍数,例如64位。我使用字节的原因是因为字节是最小的可寻址单元,如果您想要一个位,必须寻址该字节并从中提取该位。@kevingomes-
short
只有2个字节,因此它是2的倍数。改为检查
double
对齐。在许多情况下,情况比您描述的更糟,原因有两个:(1)某些处理器没有细分内存访问的能力。尝试从不是四的倍数的地址读取32位值将导致崩溃。(2) 硬件通常只能访问两种大小的数据块。处理器要将int64存储到地址3,需要将一个字节写入地址3,四个字节写入地址4,两个字节写入地址8,一个字节写入地址12。因此,未对齐访问的惩罚不是一个周期,而是三个周期。
+-------------------------+-------------------------+
| XX XX XX XX XX 12 34 56 | 78 90 ab cd ef XX XX XX |
+-------------------------+-------------------------+
                ^--------^ ^--------------^
                  Cycle 1      Cycle 2