之前我曾询问过有关stackoverflow的问题(如果您对此感兴趣,请点击链接:Passing by reference "advanced" concept?)
有趣的是,其中一个答案引起了我的兴趣,我觉得它值得一个单独的问题。
const int& x = 40;
如果40恰好是CPU缓存中的值(rvalue)。那么,通过编写该行,您是否只需保留缓存以在流程的生命周期内保存数字40?这不是一件坏事吗?
谢谢
答案 0 :(得分:7)
文字40
几乎肯定存在于一些只读存储器中,可能存在于汇编程序中(对于小值,通常有指令可以设置寄存器或地址;对于较大的值,它可以作为常量存在于某处)。它不会“存在于缓存中”。当你创建一个const
引用时,会在编译器认为适合的任何地方构造临时值来保留临时值(可能在堆栈中)。这是否存在于系统中。
如果从未采用此临时地址,则实际上甚至可能不会创建:C ++标准中的所有规则都由“as if”-rule控制。结果,参考和文字将是相同的。如果始终使用const
引用的地址,则编译器需要确定放置对象的位置,实际上,您可能会看到性能影响很小。
答案 1 :(得分:5)
您无法从程序中预留缓存空间
这不是你真正掌控的。缓存控制决策由其自己的控制器决定,该控制器研究时间和空间位置,以及决定要替换哪些缓存行以及要保留哪些缓存行。
您的数据通常有多个副本,位于不同的缓存和虚拟内存地址空间(映射到物理内存+交换)。
管理内存的方式要复杂得多。在处理内存时,系统每次都会生成一个虚拟地址。
此虚拟地址已翻译到物理地址。这种转换可以在缓存,物理内存等上产生地址。它不一定映射到一块内存。如果它已被换出,则会导致页面错误,并且该页面将加载到内存中(多个级别)。
您在此级别的决策不会影响缓存管理等低级别操作。