【发布时间】:2015-03-21 14:52:46
【问题描述】:
在下面的代码sn-p
char *str1 = "abcd";
char str2[] = "defg";
我意识到第一条语句将指向字符串文字的指针存储在可执行文件的只读部分中,而第二条语句存储在读写部分中。 在检查生成的指令时,我验证第一个指令将 Rodata 部分中指向“abcd”的指针存储到 str1。
有趣的是第二个陈述。编译器插入代码以将值存储到
char *str1 = "abcd";
8048420: c7 44 24 10 20 85 04 movl $0x8048520,0x10(%esp)
8048427: 08
char str2[] = "defg";
8048428: c7 44 24 17 64 65 66 movl $0x67666564,0x17(%esp)
804842f: 67
8048430: c6 44 24 1b 00 movb $0x0,0x1b(%esp)
编译器如何决定何时执行以下操作?
- 字符串文字存储在rodata部分
- 字符串文字存储在数据段 (rw) 中
- 字符串内存隐含在堆栈中,生成指令填充堆栈?
- 是否还有其他可能性以及硬件之间的差异?
注意:我正在运行一个带有调试符号和 -O0 的精确 32 vagrant、gcc
【问题讨论】:
-
恐怕你的问题有很多重复。