dmd1.040中的sizeof的错误?

Colorful 2009-03-04
@RednaxelaFX
不按照默认对齐方式能否提升性能,还要仔细区分一下应用场景。

大多数的时候都是按照默认对齐方式。
但是有时候也有例外。

CPU 读取内存数据一次不会只读取特定内存位置的内容,而是把这个位置附近的字节一股脑的全部读取进各级 CPU 缓存和寄存器。如果是多核,还会在各级缓存和寄存器存有几个相同的“副本”。

假如我们的数据结构在内存的排列方式不按照默认对齐方式排列,而又没通知编译器数据对齐方式,这时 CPU 读取的数据就可能在 Cache 或 Register 截掉一段或者多出一段,当需要后续内容的时候则必须再次从内存读取。

而如果通知编译器正确的对齐方式。CPU 读取的数据在 Cache 或 Register 就不会缺失。直接从 Cache 读取进 Register 或从 Register 计算即可。

想像一下,从内存读取数据快呢,还是从 Cache 或 Register 读取快?至于你说的多出来的位移和异或操作,相对于读取数据所花费的时间完全不在一个数量级上。

但是这些特殊的对齐方式仍然推荐少用为妙。毕竟不论是 32 bit 或 64 bit CPU 都是定长读取字节。如果多了仍然会影响性能,尤其是这些数据在并发程序中是共享变量时。相信大家也不会耐着性子仔细设计对齐方式,太麻烦了。

在实践中,大家都是按照默认对齐方式来排列数据结构来提升性能的。
RednaxelaFX 2009-03-04
hmm……这个值得标记下来回头有空再看看。cache miss跟branch prediction miss都很贵……
Global site tag (gtag.js) - Google Analytics