【发布时间】:2015-02-06 07:08:17
【问题描述】:
最近在面试中被问到全局寄存器变量。我搞砸了,说任何全局变量都将存储在Data段中。但是后来我被问到GCC。面试后我得出结论,gcc支持全局寄存器变量.
#include<stdio.h>
register int var asm("ebx"); //storing global variable in register explicitly
int main(void)
{
.......
}
这里是链接 https://gcc.gnu.org/onlinedocs/gcc/Global-Reg-Vars.html#Global-Reg-Vars
但现在我对它的生命周期和范围感到困惑,以及它是作为普通的全局变量还是作为寄存器变量工作?还有什么方法或一些 gcc 上的命令 以便我们确保编译器不会简单地忽略 register 关键字并将存储在实际寄存器中?
【问题讨论】:
-
你不能通过调试器试试吗?
-
@MrSykkox:你能帮我解决这个问题吗?你也可以回答我的第一个问题吗?我会很感激的。
-
我不确定寿命,但要测试一下。如果您使用的是 gdb ( -ggdb ),则使用调试标志 ( -g ) 进行编译。在您的主要代码集中 var = something.退出前设置断点。并打印寄存器值( info register ebx )。
-
另外,请注意C++11 has deprecated
register。 C 并没有盲目地追随 C++,但写作已成定局。不要在 C 中使用auto;不要在新的 C 代码中使用register(你可以在旧的 C 代码中安全地删除它)。将register用于全局变量会将您绑定到特定的C 编译器,并且基本上没有任何好处。请记住,register是对编译器的提示,而不是命令;编译器可以根据您的提示进行操作。使用register确实会阻止您获取变量的地址,但仅此而已。 -
如果你的面试官想用关于奇怪的 gcc 扩展的问题来欺骗你,那么你可能不想和这些人一起工作!