c - 寄存器 const 变量将存储在哪里?

标签 c compiler-construction constants cpu-registers

我知道当变量声明前面带有register关键字时,编译器可能会将变量放入CPU的寄存器中以便更快地访问。同样,我知道编译器可以将 const 变量放入 ROM 中,因为 const 变量的值在程序执行过程中不会改变。我还知道寄存器说明符是对实现的请求,将变量放入 CPU登记。但是,如果同时使用 constregister 标记变量,变量将存储在哪里? 考虑以下程序:

#include <stdio.h>
int main()
{
    register const int a=3;
    printf("%d",a);
    return 0;
}

在这种情况下变量存储在哪里?在 CPU 寄存器中或在堆栈中(如果编译器忽略注册请求)或在 ROM 中(如果编译器对其进行了优化)。

最佳答案

我实际上不知道任何单个编译器在这种情况下会做什么,但从逻辑上看,考虑到 register 更多的是一个建议,并且编译器是就标准而言,如果允许忽略它,我想说有三种可能的结果:

  1. 由于常量通常非常高效,并且通常可以编码为指令的一部分或进行优化,因此甚至可能不需要显式地从数据部分加载到寄存器中,因此它可能会忽略完全注册关键字并将其视为const

  2. 如果有任何代码生成步骤需要决定将哪些值放入寄存器以及将哪些值放入其他位置,并且 a 是这些值之一,则编译器可能会考虑到您将其声明为 register 并且更喜欢这样。

  3. (这可能只是 #2 的变体)编译器可能会认为您有理由在此处指定 register 并始终强制 a 进入可以的时候注册。最坏的情况是,这可能与优化器通常将代码分配给寄存器的方式背道而驰,并可能导致代码次优。或者,如果您确实知道自己在做什么,它可能会解决优化器错误。

关于c - 寄存器 const 变量将存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28250057/

相关文章:

c - 回调如何工作和全局数据同步

c - C语言中如何将二进制转换为十进制

c++ - 变量卡在 If 中

python - 为什么 math.pi 和 math.e 常量在 Python 中写成小写?

c++ - strcpy() 导致从 ‘const char*’ 到 ‘char*’ 的无效转换 [-fpermissive]

c - opencv 在视频上显示变量

c - 访问指针使其值改变

对象的 C++ memcpy 拷贝出现损坏

c - 总线错误 - 这段代码有什么问题?

compiler-construction - 单一静态赋值形式的全局变量