const int&performance issue

Kam*_*Kam 2 c++ reference

我曾经问过一个关于stackoverflow的问题(如果你对此感兴趣的话是链接:通过引用传递"高级"概念?)

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

const int& x = 40;
Run Code Online (Sandbox Code Playgroud)

如果40恰好是CPU缓存中的值(rvalue).那么,通过编写该行,您是否只需保留缓存以在流程的生命周期内保存数字40?这不是一件坏事吗?

谢谢

Die*_*ühl 7

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

如果从未采用此临时地址,则实际上甚至可能不会创建:C++标准中的所有规则都由"as if"-rule控制.结果,参考和文字将是相同的.如果const始终使用引用的地址,则编译器需要决定放置对象的位置,实际上,您可能会看到性能影响很小.


Ani*_*han 5

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

它并不是你真正掌控的.缓存控制决策由其自己的控制器决定,该控制器研究时间和空间位置,以及决定要替换哪些缓存行以及要保留哪些缓存行.

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


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

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

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