我只想了解如何在C程序可执行文件中处理寄存器变量.即在嵌入式系统和X86机器(C台程序中可执行的C程序)中,它在哪个位置(或寄存器)准确存储?
这个观点怎么样?(如果我错了,请纠正我)
假设我们已将函数内的一个变量声明/初始化为'int'数据类型.通常它会进入堆栈段,只有在运行时,当调用者调用包含局部变量的被调用者时,它才会出现在该部分中.但是如果我们将上面的局部变量声明为'register int',那么它也将转到堆栈段.但是在运行时,处理器将堆栈中的局部变量放入其通用寄存器位置(因为'register'关键字导致额外的编译器插入代码)以及从那里快速访问它.
这是它们之间唯一的区别是在运行时访问,并且它们之间没有内存加载差异.
__Kanu
abe*_*nky 10
registerC中的关键字(很少见过)只是对编译器的一个提示,即将变量保存在寄存器中以便更快地访问它可能是有用的.
编译器可以自由地忽略提示,并在最佳情况下进行优化.
由于现代编译器在理解使用和速度方面要比人类好得多,因此register关键字通常被现代编译器忽略,在某些情况下,实际上可能会降低执行速度.
小智 7
来自K&R C:
寄存器变量建议编译器将大量使用有问题的变量.我们的想法是将寄存器变量放在机器寄存器中,这可能会导致更小更快的程序.但编译器可以自由地忽略这个建议.
无论变量是否实际放在寄存器中,都不可能获取寄存器变量的地址.
因此,
register int x;
int *y = &x; // is illegal
Run Code Online (Sandbox Code Playgroud)
所以,你必须权衡无法获得寄存器变量的地址.