【问题标题】:Caching data in each iteration of a for loop在 for 循环的每次迭代中缓存数据
【发布时间】:2022-02-03 00:43:52
【问题描述】:

例如,我有以下 for 循环:

for (int i = 0; i < 5; i++){
    for (int j = 0; j < 5; j++){
        int a = i + j;
    }
}

每次迭代中i 的值存储在哪里?会自动存入缓存吗?

【问题讨论】:

  • 你指的是什么缓存?根据处理器、编译器和选项,i 可能根本不存储在任何内存中,而可能只是在寄存器中。目前还不清楚您要问什么。事实上,整个代码块很可能会被完全优化,因为循环基本上什么都不做,因为a 的生命周期只有一次迭代。
  • 请注意,由于从未使用过a,因此优化编译器可能会从已编译的程序中删除 i、j、a 和整个循环。
  • 如下面的答案所述,编译器可以展开循环并将ij 的硬编码值粘贴到a 的每个计算中。但是由于 a 没有在任何地方使用,编译器可以只删除循环和计算并获得相同的结果 - 如果您想要完成计算,您需要使用 a 做一些事情。

标签: c memory


【解决方案1】:

C 语言是由 C 标准指定的,它使用一个想象的计算机来执行 C 标准中描述的事情。在这个抽象计算机中,用int i = 0 定义i 会在内存中保留一些字节来保存i 的值。在整个循环中,i 的值都在该内存中。没有为这台抽象计算机指定缓存,只是某种没有物理描述的内存。

当编译器将 C 程序翻译成汇编语言时,C 标准允许编译器创建任何产生与抽象计算机相同的可观察结果的汇编语言。在翻译后的程序中,i 的值可能在内存中,它可能在处理器寄存器中,或者如果编译器找到一种不使用 i 来计算相同结果的方法,它可能会完全从程序中删除.如果它在内存中,处理器也可能将它存储在缓存中。在大多数情况下,处理器会自动缓存内存中的数据,无需程序直接干预。

【讨论】:

    猜你喜欢
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 2020-02-27
    相关资源
    最近更新 更多