(精彩的)书中的以下陈述c++模板(第109页)向我建议,通过引用将参数传递给函数可能会迫使处理器再次缓存关联的变量:
在底层,通过引用传递参数是通过传递参数的地址来实现的。地址被紧凑地编码,因此将地址从调用者传输到被调用者本身是高效的。但是,传递地址可能会在编译器编译调用者的代码时给编译器带来不确定性:被调用者正在使用该地址做什么?理论上,被调用者可以更改通过该地址“可达”的所有值。这意味着,编译器必须假设它可能缓存的所有值(通常在机器寄存器中)在调用后都是无效的。重新加载所有这些值可能会非常昂贵。
围绕引用的讨论提到 const-reference 也可能在函数调用返回后再次被缓存。读完这篇声明后,我想到了以下两个问题:
您通常无法编写与 CPU 缓存 相关的可移植 C++ 代码。有些微控制器没有任何缓存。一些高端处理器有多个级别。
注意内置的 GCC
__builtin_prefetch
。
我相信其他一些编译器也有类似的东西
但另请参阅这个答案。在许多情况下,您不应该使用
__builtin_prefetch