执行此操作时编译器会执行什么操作?
struct something {
int number;
}
Run Code Online (Sandbox Code Playgroud)
内存与int有什么不同?
小智 7
C编译器是否用一个成员优化结构?
这完全取决于编译器.和当前的编译器设置.并且编译的代码.和平台.以及天狼星和月亮的相对位置.我们不知道.如果您询问特定体系结构上的特定编译器,并且打开了特定的编译器标志,那么在编译给定的代码时,我们可以编译它并查看生成的程序集以查看它的作用.但是,你也可以为自己做这件事.
也就是说,一般来说,我希望现代优化编译器能够在开启相当高的优化级别时进行此转换.
编辑:关于可能存在什么样的差异:我不仅仅是谈论结构内部成员的偏移; 正如其他人已经正确观察到的那样,很可能在访问这种结构的成员时以及在独立操作时生成完全相同的机器代码int.
但是,还有其他与结构相关的属性可能会有所不同.我可以想到两个例子.
第一个与任务有关.当您分配给a时struct,某些编译器将发出对该memcpy()函数的调用,而对a的赋值int可能只需要一个机器指令而无需任何函数调用,例如mov [address], [value].
第二个行为差异与函数返回值有关.一些(旧的)ABI规定返回struct推送它们在堆栈上的返回值的函数,而简单的原始返回值(通常是内置的核心语言类型)通常被放入寄存器中.因此,对于非优化编译器,理论上可以生成push将单个int放在堆栈上的指令,而不是使用返回值寄存器.