C++ 康斯特国际酒店;性能问题

C++ 康斯特国际酒店;性能问题,c++,reference,C++,Reference,我之前问过一个关于stackoverflow的问题(如果你感兴趣,这里有链接:) 有趣的是,其中一个答案引起了我的兴趣,我觉得它值得一个单独的问题 const int& x = 40; 如果40恰好是CPU缓存中的一个值(右值)。那么,通过写这一行,您是否会保留高速缓存,以便在进程的生命周期中保存数字40?这不是一件坏事吗 谢谢您不能从程序中在缓存上保留空间 这不是你真正能控制的。缓存控制决策由其自己的控制器做出,该控制器研究时间和空间局部性,以及其他事项,以决定替换哪些缓存线和保留哪

我之前问过一个关于stackoverflow的问题(如果你感兴趣,这里有链接:)

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

const int& x = 40;
如果40恰好是CPU缓存中的一个值(右值)。那么,通过写这一行,您是否会保留高速缓存,以便在进程的生命周期中保存数字40?这不是一件坏事吗


谢谢

您不能从程序中在缓存上保留空间

这不是你真正能控制的。缓存控制决策由其自己的控制器做出,该控制器研究时间和空间局部性,以及其他事项,以决定替换哪些缓存线和保留哪些缓存线

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


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

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


诸如缓存管理之类的低级操作不受此级别决定的影响。

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


如果这个临时地址不被占用,它实际上可能甚至不被创建:C++标准中的所有规则都由“仿佛”来控制。-规则。因此,引用和文本将是相同的。如果引用的

const
地址被取下,编译器需要决定将对象放在何处,您可能会看到一个小的性能影响。

另一个问题似乎回答了这一点:“const int&x=40;与int=40;const int&x=;具有相同的语义,但这与编译器实际实现的内容无关,因为原样规则允许编译器删除所有垃圾。@loki astari在另一个问题中,他们只是说你可以想到缓存中的值,而不是说实际上没有“缓存”在C++中,可能的副本可能更大,或者更大的可能性,你不会看到任何差异。我同意你的评论,但是应该注意到,因为数据对齐可以在C++ 11中选择,高级别的选择实际上可以影响最下层的管理是如何完成的。