Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::alignas如何优化程序的性能?_C++_C++11_Optimization_Alignas - Fatal编程技术网

C++ std::alignas如何优化程序的性能?

C++ std::alignas如何优化程序的性能?,c++,c++11,optimization,alignas,C++,C++11,Optimization,Alignas,在32位机器中,一个内存读取周期获得4个字节的数据。 因此,对于读取以下缓冲区,读取下面提到的128字节的缓冲区需要32个读取周期。 char buffer[128]; 现在,假设我已经按照下面提到的方式对齐了这个缓冲区,那么请让我知道它将如何提高读取速度 alignas(128) char buffer[128]; 我假设内存读取周期仅为4字节。用于内存访问的寄存器的大小只是故事的一部分,另一部分是缓存线的大小 如果缓存线为64字节,并且char[128]自然对齐,则CPU通常需要操作三条

在32位机器中,一个内存读取周期获得4个字节的数据。
因此,对于读取以下缓冲区,读取下面提到的128字节的缓冲区需要32个读取周期。

char buffer[128];
现在,假设我已经按照下面提到的方式对齐了这个缓冲区,那么请让我知道它将如何提高读取速度

alignas(128) char buffer[128];

我假设内存读取周期仅为4字节。

用于内存访问的寄存器的大小只是故事的一部分,另一部分是缓存线的大小

如果缓存线为64字节,并且
char[128]
自然对齐,则CPU通常需要操作三条不同的缓存线。使用
alignas(64)
alignas(128)
,只需触摸两条缓存线

如果您使用的是内存映射文件,或者是在交换条件下,那么下一个对齐级别将起作用:内存页的大小。这需要4096或8192字节对齐

但是,如果指定的对齐方式大于编译器使用的自然对齐方式,我严重怀疑
alignas()
是否有任何显著的积极影响:它会显著增加内存消耗,这可能足以触发更多缓存线/内存页被首先触及。需要避免的只是微小的偏差,因为它们可能会导致某些CPU的速度大幅下降,或者在其他CPU上可能是完全非法/不可能的

因此,真理只存在于测量中:如果您需要所有可以得到的加速,请尝试一下,测量运行时差异,看看它是否有效

在32位机器中,一个内存读取周期获得4字节的数据

不是那么简单。只是术语“32位机器”已经太宽泛了,可能意味着很多事情。32b寄存器(GP寄存器?ALU寄存器?地址寄存器?)?32b地址总线?32b数据总线?32b指令字大小

以及由谁来“读记忆”。中央处理器?隐藏物DMA芯片


如果你有一个HW平台,在一个周期内,4个字节(4个对齐)读取内存,而没有任何缓存,那么<代码>对齐(128)< /C++ >将没有区别(比<代码>对齐(4)< /代码>)。回答这个问题需要确切的处理器和编译器。相关:你不能肯定在32位机器中,一个内存读取周期可以获得4字节的数据。。请参阅SIMD说明。