C register
关键字给编译器一个提示,它更喜欢将变量存储在寄存器中而不是堆栈中。编译器可以根据需要忽略它。我知道现在当您在启用优化的情况下进行编译时,它几乎毫无用处,但它完全没用吗?
更具体地说:对于 { gcc, clang, msvc } x { -Og, -O, -O2, -O3 } 的任意组合:在决定是否实际分配寄存器时是否忽略 register
?如果不是,在某些情况下它是否足够有用而不必费心使用它?
注意事项:
- 我不是询问关键字是否有任何效果;当然可以——它会阻止您使用该变量的地址;如果您根本不进行优化,变量的寄存器分配或内存分配就会有所不同。
- 非常欢迎仅针对一个编译器/以上某些组合的回答。
最佳答案
对于 GCC,register
对代码生成根本没有影响,甚至没有任何提示,在所有优化级别,对于所有十多年来一直支持 CPU 架构。
这主要是历史原因。 GCC 2.95 及更早版本有两个寄存器分配器,一个(“愚蠢”)在不优化时使用,一个(“本地、全局、重新加载”)在优化时使用。 “愚蠢的”分配器确实尝试遵守 register
,但“本地、全局、重新加载”分配器完全忽略了它。 (我不知道这个设计决定的最初理由是什么;你得问问 Richard Kenner。)在 3.0 版中,“愚蠢的”分配器被废弃,取而代之的是为“本地、全局、重新加载”。没有人费心编写代码使该模式关注 register
,所以它没有。
在撰写本文时,GCC 开发人员正在用名为“IRA 和 LRA”的新分配器替换“本地、全局、重新加载”,但它也完全忽略了 register
.
但是,您不能获取 register
变量地址的(仅 C 语言)规则仍然强制执行,关键字由 explicit register variable extension 使用。 ,它允许您将一个特定寄存器专用于一个变量;这在使用大量内联汇编的程序中很有用。
关于c - 优化时,在现代编译器中使用 `register` 关键字是否无用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43475229/