有没有办法强制将变量存储在C中的缓存中?

我刚接到电话采访时被问到这个问题。 我知道如何存储在寄存器或堆或堆栈中,但具体缓存?

不是C语言。 在GCC中作为编译器 – 寻找__builtin_prefetch

您可能有兴趣阅读每个程序员应该了解的内存

编辑:

只是为了清除一些混淆 – 缓存在硬件中是物理上独立的记忆,而不是机器的软件抽象。 缓存中的字始终与主存中的地址相关联。 这与CPU寄存器不同,CPU寄存器与RAM分开命名/寻址。

在C中,如C标准所定义的那样? 没有。

在C中,如在特定平台上的某些特定实现? 也许。

由于缓存是一个CPU概念,对于C语言来说没有任何意义(C语言的目标处理器没有缓存,今天不太可能,但在过去很常见)绝对没有

试图手工优化这些东西通常也是一个非常糟糕的主意。

你可以做的是让编译器保持循环非常短,只做一件事(适用于指令缓存),以正确的顺序迭代内存块(更喜欢访问内存中的连续单元以稀疏访问),避免工作变得容易重复使用相同的变量用于不同的用途(它引入了写后读依赖关系)等。如果您关注这些细节,程序更有可能被编译器高效优化并缓存内存访问。

但它仍然取决于实际的硬件,甚至编译器也可能无法保证。

这取决于平台,因此如果您正在与面向当前一代控制台的公司交谈,则需要了解PowerPC数据缓存内在函数/指令。 在各种平台上,您还需要知道错误的共享规则。 此外,您无法从显式标记为未缓存的内存进行缓存。

如果没有关于实际工作或公司或问题的更多上下文,可能最好通过讨论在数据缓存中保留内存引用不做的事情来回答这个问题。

如果您试图强制将某些内容存储在CPU缓存中,我建议您避免尝试这样做,除非您有一个非常好的理由。 手动操作CPU缓存可能会产生各种意想不到的后果,其中最重要的是多核或多CPU应用程序中的一致性。 这是由CPU在运行时完成的,并且通常对程序员和编译器是透明的,这是有充分理由的。

具体答案取决于您的编译器和平台。 如果您的目标是MIPS架构,那么可以使用CACHE指令(汇编)来执行CPU缓存操作。