c - 优化时,在现代编译器中使用 `register` 关键字是否无用?

标签 c gcc visual-c++ clang

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/

相关文章:

c - SIMD 代码运行速度比标量代码慢

visual-c++ - Visual Studio : automatically update C++ cpp/header file when the other is changed?

c - 链表不打印?

c - 在ARM嵌入式C编程中使用定时器

c++ - Ubuntu - 链接 boost.python - fatal error : pyconfig cannot be found

c - 为什么可变长度数组不能全局使用?

c++ - lambda 应该能够看到本地类吗?

c++ - 跨平台 _wtoi() 实现?

java - 最好使用哪种无限循环

c++ - GCC编译器一个字节有多少位数