我刚接到电话采访时被问到这个问题。我知道存储在寄存器或堆或堆栈中的方法,但具体是缓存吗?
答案 0 :(得分:11)
不在C语言中。在GCC中作为编译器 - 寻找__builtin_prefetch
。
您可能有兴趣阅读What every programmer should know about memory。
只是为了清除一些混淆 - 缓存在硬件中是物理上独立的记忆,而不是在机器的软件抽象中。高速缓存中的字始终与主存储器中的地址相关联。这与CPU寄存器不同,CPU寄存器与RAM分开命名/寻址。
答案 1 :(得分:2)
在C中,如C标准所定义的那样?否。
在C中,如在特定平台上的某些特定实现?也许
答案 2 :(得分:2)
由于缓存是一个CPU概念,对C语言没有意义(C语言的目标处理器没有缓存,今天不太可能,但在过去很常见)肯定否。
尝试用手来优化这些事情通常也是一个非常糟糕的主意。
你可以做的就是让编译器保持工作变得简单,只做一件事(对于指令缓存很好),以正确的顺序迭代内存块(更喜欢访问内存中的连续单元以进行稀疏访问) ),避免重复使用相同的变量用于不同的用途(它引入了写后读取依赖性)等。如果您注意这些细节,程序更有可能被编译器高效优化并缓存内存访问。
但它仍然取决于实际硬件,甚至编译器也可能无法保证。
答案 3 :(得分:2)
这取决于平台,因此如果您正在与面向当前一代控制台的公司交谈,则需要了解PowerPC数据缓存内在函数/指令。在各种平台上,您还需要知道错误的共享规则。此外,您无法从显式标记为未缓存的内存中缓存。
如果没有关于实际工作或公司或问题的更多背景信息,可能最好通过讨论不来做什么来保持数据缓存中的内存引用。
答案 4 :(得分:0)
如果您试图强制将某些内容存储在CPU缓存中,我建议您避免尝试这样做,除非您有一个非常好的理由。手动操作CPU缓存可能会产生各种意想不到的后果,其中最重要的是多核或多CPU应用程序中的一致性。这是由CPU在运行时完成的,并且通常对程序员和编译器是透明的。
具体答案取决于您的编译器和平台。如果您的目标是MIPS架构,那么有CACHE
指令(汇编)允许您进行CPU缓存操作。