2

我之前问过一个关于 stackoverflow 的问题(如果您有兴趣,请点击以下链接:通过引用传递“高级”概念?

有趣的是,其中一个答案引起了我的兴趣,我觉得它值得一个单独的问题。

const int& x = 40;

如果 40 恰好是 CPU 缓存中的一个值(右值)。那么您是否会通过编写该行仅保留高速缓存以在进程的整个生命周期内保存数字 40?这不是一件坏事吗?

谢谢

4

2 回答 2

7

文字40几乎肯定存在于一些只读存储器中,可能在汇编器中(对于较小的值,通常有可以设置寄存器或地址的指令;对于较大的值,它将作为常量存在于某个地方)。它不在“缓存中”。当您创建对它的const引用时,会在编译器认为适合保留临时文件的任何地方(可能在堆栈上)构造一个临时文件。这是否存在于任何缓存中取决于系统。

如果这个临时地址从未被占用,它实际上甚至可能不会被创建:C++ 标准中的所有规则都受“好像”规则的约束。结果,引用和文字将是相同的。如果const引用的地址曾经被占用,编译器需要决定将对象放在哪里,并且您确实可能会看到很小的性能影响。

于 2012-11-11T15:12:50.023 回答
5

您无法从程序中保留缓存空间

它真的不在你的控制范围内。缓存控制决策由其自己的控制器做出,该控制器研究时间和空间局部性,其中包括决定替换哪些缓存行以及保留哪些缓存行。

通常有多个数据副本,位于不同的缓存和虚拟内存地址空间(映射到物理内存 + 交换)。


管理内存的方式远比这复杂得多。在处理内存时,系统每次都会生成一个虚拟地址。

这个虚拟地址被翻译成物理地址。这种转换可以在高速缓存、物理内存等上产生一个地址。它不一定映射到一块内存。如果它已被换出,则会导致页面错误并且该页面被加载到内存中(多级)。

缓存管理等低级别操作不受您在此级别的决策的影响。

于 2012-11-11T15:12:23.720 回答