我已经在Compiler Exporer中编译了以下C代码,以查看其如何处理const
关键字:
int a=1;
const b=2;
int func () {
int c=3;
const int d=4;
}
.section .data
a:
.long 1
.section .rodata
b:
.long 2
func:
pushq %rbp
movq %rsp, %rbp
movl $3, -4(%rbp)
movl $4, -8(%rbp)
nop # also, why does it add a nop here?
popq %rbp
ret
据我所知,对于在函数外部定义的变量(文件的全局变量),它在顶部添加了标签。但是,如果它是一个const
变量,则顶部的变量将放置在只读部分中。然后我的问题是下面的局部变量:
const int d=4;
它的“恒定性”如何管理,因为它只是堆栈中的一个值,并且堆栈中的任何值都不能自由修改吗?或者,在汇编中,没有诸如常量局部变量之类的东西,而这仅仅是编译器强制的概念?
如果您不使用地址,则无需const
在任何地方在数据存储器中保留本地地址。asm的等效项是NASMd equ 4
或GAS,d = 4
因此您可以在需要时立即将其用作立即。
与const
不会发生变化的非int相同:是的,局部性的constness纯粹是编译器执行的可帮助您捕获错误的编译时事物。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句