c++ - gcc/g++ 可以在忽略我的寄存器时告诉我吗?

标签 c++ c gcc g++ cpu-registers

用gcc/g++编译C/C++代码时,如果忽略了我的寄存器,能告诉我吗? 例如,在这段代码中

int main()
{
    register int j;
    int k;
    for(k = 0; k < 1000; k++)
        for(j = 0; j < 32000; j++)
            ;
    return 0;
}

j 将用作寄存器,但在此代码中

int main()
{
    register int j;
    int k;
    for(k = 0; k < 1000; k++)
        for(j = 0; j < 32000; j++)
            ;
    int * a = &j;
    return 0;
}

j 将是一个普通变量。 它能告诉我我使用寄存器的变量是否真的存储在 CPU 寄存器中吗?

最佳答案

您完全可以假设 GCC 会忽略 register 关键字,除了 -O0。但是,它不应该以任何方式产生影响,如果您深入了解,您应该已经在阅读汇编代码了。

这是关于此主题的信息线程:http://gcc.gnu.org/ml/gcc/2010-05/msg00098.html .在过去,register 确实帮助编译器将变量分配到寄存器中,但今天寄存器分配可以自动优化地完成,无需提示。关键字在 C 语言中继续服务于两个目的:

  1. 在 C 中,它会阻止您获取变量的地址。由于寄存器没有地址,这个限制可以帮助简单的 C 编译器。 (不存在简单的 C++ 编译器。)
  2. register 对象不能声明为restrict。因为 restrict 与地址有关,所以它们的交集没有意义。 (C++ 还没有restrict,反正这个规则有点琐碎。)

对于 C++,该关键字自 C++11 和 proposed for removal 以来已被弃用来自计划于 2017 年进行的标准修订。

一些编译器在参数声明中使用 register 来确定函数的调用约定,ABI 允许混合基于堆栈和寄存器的参数。这似乎是不符合规范的,它往往会出现在像 register("A1") 这样的扩展语法中,我不知道是否还有这样的编译器在使用。

关于c++ - gcc/g++ 可以在忽略我的寄存器时告诉我吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3500301/

相关文章:

gcc - 如何将目标文件添加到每个链接

c++ - std::chrono 纳秒计时器适用于 MSVC,但不适用于 GCC

c++ - C++ 问题中的字符串转字符

c++ - 如果我不想在 QAbstractItemView 中实现选择,我应该返回什么值?

c++ - 谷歌 Protocol Buffer : No operator[]?

c - 如何使用 C 编程将超过 255 个字符写入 CSV 单元格?

c - C 指针有问题

c++ - 你会把 C++ RValue 引用参数标记为 const

需要 C 项目帮助

c++ - 静态大小数组的堆栈保护的预期行为是什么?