C 当使用寄存器存储类声明变量时,使用了多少个寄存器?
我的问题很简单,对于使用C 当使用寄存器存储类声明变量时,使用了多少个寄存器?,c,cpu-registers,storage-class-specifier,C,Cpu Registers,Storage Class Specifier,我的问题很简单,对于使用register存储类声明的变量,C编译器将使用多少个寄存器,如下所示: 寄存器int a。我读过这个答案,但不太明白。我知道它可能依赖于实现,但是这个寄存器是有限的,那么编译器什么时候会忽略声明或者生成错误呢?C11仍然支持寄存器: 具有存储类的对象的标识符声明 说明符寄存器建议尽可能快地访问对象 可能的这些建议的有效程度是: 实现定义 在附注中: 实现可以将任何寄存器声明简单地视为 自动申报 那么将使用多少个寄存器?一个可能的答案是“无”,因为关键字可能被忽略 也就是
register
存储类声明的变量,C编译器将使用多少个寄存器,如下所示:
寄存器int a
。我读过这个答案,但不太明白。我知道它可能依赖于实现,但是这个寄存器是有限的,那么编译器什么时候会忽略声明或者生成错误呢?C11仍然支持寄存器
:
具有存储类的对象的标识符声明
说明符寄存器建议尽可能快地访问对象
可能的这些建议的有效程度是:
实现定义
在附注中:
实现可以将任何寄存器声明简单地视为
自动申报
那么将使用多少个寄存器?一个可能的答案是“无”,因为关键字可能被忽略
也就是说,在实践中,任何现代平台上的实现都很少定义int
的宽度大于典型平台“单词”的宽度。因此,如果一个实现尊重寄存器inta代码>不太可能将寄存器int a
分配给多个寄存器,寄存器int a
可能是0、1或2个寄存器
当然,在某些硬件上,并非所有寄存器的大小都相同,有时不同的指令将寄存器视为单独的或连接的。有多少寄存器可能没有意义
其他人指出,在C中广泛使用关键字,实际上它的含义从C++中删除(尽管关键字保留为保留)。
我认为,在C语言中,这将是一种严厉的做法,因为它仍然关注微控制器环境,程序员最接近于这种环境,他们想要口述这些细节
上面所说的“回到过去”(25年前)我使用的编译器忽略了register
,但将前2个(我认为)声明的变量作为循环计数器分配给了寄存器,在这种情况下,函数中的第三个循环最长,通过首先声明大循环索引,性能显著提高
这一切似乎是很久以前的事了,没有人应该把它当作现代经验 C11仍然支持寄存器
:
具有存储类的对象的标识符声明
说明符寄存器建议尽可能快地访问对象
可能的这些建议的有效程度是:
实现定义
在附注中:
实现可以将任何寄存器声明简单地视为
自动申报
那么将使用多少个寄存器?一个可能的答案是“无”,因为关键字可能被忽略
也就是说,在实践中,任何现代平台上的实现都很少定义int
的宽度大于典型平台“单词”的宽度。因此,如果一个实现尊重寄存器inta代码>不太可能将寄存器int a
分配给多个寄存器,寄存器int a
可能是0、1或2个寄存器
当然,在某些硬件上,并非所有寄存器的大小都相同,有时不同的指令将寄存器视为单独的或连接的。有多少寄存器可能没有意义
其他人指出,在C中广泛使用关键字,实际上它的含义从C++中删除(尽管关键字保留为保留)。
我认为,在C语言中,这将是一种严厉的做法,因为它仍然关注微控制器环境,程序员最接近于这种环境,他们想要口述这些细节
上面所说的“回到过去”(25年前)我使用的编译器忽略了register
,但将前2个(我认为)声明的变量作为循环计数器分配给了寄存器,在这种情况下,函数中的第三个循环最长,通过首先声明大循环索引,性能显著提高
这一切似乎是很久以前的事了,没有人应该把它当作现代经验 寄存器
建议编译器尽可能将变量保留在寄存器中。但现代的编译器只是忽略了它。因此,回答您问题的答案可以是零或更多,编译器将根据使用的优化选项来决定
有些编译器具有将变量绑定到寄存器的特殊形式
gcc版本
register int *foo asm ("r12");
它可以是全局绑定或本地绑定
全局绑定:寄存器变量保存在寄存器中,用于整个程序执行,寄存器从编译器寄存器池中取出。这会降低编译器优化的效率
局部绑定:寄存器变量仅在函数范围内绑定到寄存器
但不能保证在没有-ffix reg
选项的情况下编译的库例程不会影响该寄存器。与setjump
和longjump
相同,因为寄存器内容的恢复是特定于机器的
为了有效地使用机器代码,需要对机器代码生成有深入的理解。现在很少使用。使用示例-减少响应中断请求和类似请求的延迟。建议编译器尽可能将变量保留在寄存器中。但现代的编译器只是忽略了它。因此,回答您问题的答案可以是零或更多,编译器将根据使用的优化选项来决定
有些编译器具有将变量绑定到寄存器的特殊形式
gcc版本
register int *foo asm ("r12");
它可以是全局绑定或本地绑定
全局绑定:寄存器变量保存在寄存器中,用于整个程序执行,寄存器从编译器寄存器池中取出。它会降低编译器优化的效果