在 32 位机器中,一个内存读取周期获得 4 个 bytes
数据。
因此,对于读取缓冲区以下,读取下面提到的 128 个 bytes
缓冲区应该需要 32 个读取周期。
char buffer[128];
现在,假设如果我按照下面提到的方式对齐了这个缓冲区,那么请告诉我它如何使它更快地阅读?
alignas(128) char buffer[128];
我假设内存读取周期将仅保留 4 个字节。
最佳答案
用于内存访问的寄存器的大小只是故事的一部分,另一部分是缓存行的大小。
如果缓存行是 64 字节并且您的 char[128]
自然对齐,则 CPU 通常需要操作三个不同的缓存行。使用 alignas(64)
或 alignas(128)
,只需要触及两条缓存线。
如果您正在处理内存映射文件,或在交换条件下,下一级对齐开始:内存页的大小。这将需要 4096 或 8192 字节对齐。
但是,如果指定的对齐方式大于编译器使用的自然对齐方式,我严重怀疑 alignas()
是否有任何显着的积极影响:它显着增加了内存消耗,这可能足以触发更多缓存行/内存页面被触及第一名。这只是需要避免的小错位,因为它们可能会在某些 CPU 上引发巨大的减速,或者在其他 CPU 上可能是完全非法/不可能的。
因此,真理只在测量中:如果您需要所有可以获得的加速,请尝试它,测量运行时差异,然后看看它是否有效。
关于c++ - std::alignas 如何优化程序的性能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40527255/