C 自动变量和寄存器变量——优化相同吗?

C 自动变量和寄存器变量——优化相同吗?,c,compiler-optimization,setjmp,C,Compiler Optimization,Setjmp,我正在读APUE,当我谈到longjmp时,问题来了。书中说,在优化之前,自动变量和寄存器变量都存储在内存中,优化之后,它们存储在寄存器中。但是当我使用objdump-sa.out时,我发现它们都变成了立即操作数。那么 因此您使用了不同的编译器,可能在不同的机器上,可能具有不同的优化级别,从中您基本上无法得出任何结论,除了编译器的行为有所不同,这使得编写一本在所有机器上始终准确无误的教科书变得非常困难。因此,程序非常简单,而且自编写该书以来,编译器变得更加智能 你的书只是在简化。即使在优化之前,

我正在读APUE,当我谈到
longjmp
时,问题来了。书中说,在优化之前,自动变量和寄存器变量都存储在内存中,优化之后,它们存储在寄存器中。但是当我使用objdump-sa.out时,我发现它们都变成了立即操作数。那么

因此您使用了不同的编译器,可能在不同的机器上,可能具有不同的优化级别,从中您基本上无法得出任何结论,除了编译器的行为有所不同,这使得编写一本在所有机器上始终准确无误的教科书变得非常困难。

因此,程序非常简单,而且自编写该书以来,编译器变得更加智能

你的书只是在简化。即使在优化之前,也不能保证变量在内存中实现。
auto
register
之间的区别在于不允许您获取
register
变量的地址。C编译器可以做任何与抽象机器行为相同的事情


您的编译器将这些变量实现为立即变量,这表明您的值很小,并且是编译时常量。因此,您可能首先声明了它们
const
,甚至声明为
enum
常量。

谢谢您的回答。这就是重点?我是说,有点惊讶,你知道,为什么会惊讶?你到底想知道什么?还是谢谢你。似乎我需要更多地注意编译器之间的差异。直接使用编译器生成汇编输出通常要简单得多。对于gcc,选项为
-S
而不是
-c
。如果不允许获取
寄存器
变量的地址,如何获取该变量的值?谢谢你。@znlyj,我不确定我是否理解你的问题。要获取变量的值,只需在表达式中将其与任何其他变量一样使用。不允许您使用
&
操作符获取其地址。好的,谢谢您的回答。但是你说的“即使在优化之前,也不能保证变量在内存中实现”是什么意思?@znlyj,我的意思是编译器可以决定将变量放入寄存器的代码,即时(或计算机架构的未来可能带来的任何东西),即使没有任何优化选项。编译器完全可以自由地实现看起来不错的程序,只要它的行为与抽象机器中的行为相同。