Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 当使用寄存器存储类声明变量时,使用了多少个寄存器?_C_Cpu Registers_Storage Class Specifier - Fatal编程技术网

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");
它可以是全局绑定或本地绑定

全局绑定:寄存器变量保存在寄存器中,用于整个程序执行,寄存器从编译器寄存器池中取出。它会降低编译器优化的效果