ein*_*ica 1 c gcc clang visual-c++
C register关键字为编译器提供了一个提示,希望将变量存储在寄存器中,而不是存储在堆栈中.如果喜欢,编译器可以忽略它.我知道,当你打开优化编译时,它几乎没用了,但它完全没用吗?
更具体地说:对于{gcc,clang,msvc} x {-Og,-O,-O2,-O3}的任何组合:register在决定是否实际分配寄存器时会被忽略?如果没有,是否存在使用它有用的麻烦?
笔记:
对于海湾合作委员会,register已对代码生成无影响可言的,甚至不是一个提示,所有的优化级别,对于所有支持的CPU架构,超过十年.
其原因在很大程度上是历史性的.GCC 2.95及更早版本有两个寄存器分配器,一个("愚蠢")在未优化时使用,一个("本地,全局,重载")在优化时使用."愚蠢"的分配器确实试图兑现register,但"本地,全局,重载"分配器完全忽略了它.(我不知道该设计决定的原始理由是什么;你必须要问Richard Kenner.)在版本3.0中,"愚蠢"的分配器被废弃,转而采用快速和草率的模式来"本地的,全球的,重新加载".没有人费心去编写代码以使该模式受到关注register,所以事实并非如此.
在撰写本文时,GCC开发人员正在用一个名为"IRA和LRA"的新分配器替换"本地,全局,重新加载",但它也完全忽略了register.
但是,register仍然强制执行不能获取变量地址的(仅限C)规则,并且显式寄存器变量扩展使用关键字,这允许您将特定寄存器专用于变量; 这在使用大量内联汇编的程序中非常有用.