- 论坛徽章:
- 0
|
从汇编语言的角度看待const
struct T{
char *name;
int * id;
}
struct T t1 { "fuck", &a };
gcc编译如上代码的汇编代码如下:
.globl t1
.section .rodata
.LC0:
.string "fuck"
.data
.align 4
.type t1, @object
.size t1, 8
t1:
.long .LC0
.long a
.section .rodata
从as的角度,a是const,因为as能直接引用a的地址。但是如果初始化时写做p,那么这里引用的
就应该是p的值。但是这里是对全局变量t1的定义,而非statement,从汇编语言定义的角度是错误的。
struct T t1 { "fuck", p};
如果采用g++编译,其汇编代码如下:
.globl t1
.section .rodata
.LC0:
.string "kk"
.data
.align 4
.type t1, @object
.size t1, 8
t1:
.long .LC0
.zero 4
最后的.zero指示as用0填充4个byte,这说明as不能在编译时能设置t1.id。而实际上,g++额外生成了如下的
代码来完成对t1的最终初始化:
.globl __gxx_personality_v0
.align 2
.type _Z41__static_initialization_and_destruction_0ii, @function
_Z41__static_initialization_and_destruction_0ii:
.LFB3:
pushl %ebp
.LCFI5:
movl %esp, %ebp
.LCFI6:
subl $8, %esp
.LCFI7:
movl %eax, -4(%ebp)
movl %edx, -8(%ebp)
cmpl $1, -4(%ebp)
jne .L7
cmpl $65535, -8(%ebp)
jne .L7
movl p, %eax
movl %eax, t1+4
.L7:
leave
ret
.LFE3:
.size _Z41__static_initialization_and_destruction_0ii, .-_Z41__static_initialization_and_destruction_0ii
如上语句的movl %eas, t1+4就是对t1.id的初始化,而这个函数会在启动main之前被调用,所以在进入main之后,t1.id已经
被设置为p的值了,即&a。 |
|