const全局变量
const全局变量是存储在.rodata节中的
#include <iostream>
#include <string>
using namespace std;
const int yanjia = 10;
int main() {
return 0;
}
上面的代码编译出可执行文件,然后通过objdump -t 这个可执行文件,能看到所有符号所在的段。 可以看到yanjia这个全局变量(名字被编译器换成了_ZL6yanjia)所处的位置是 .rodata 。但是也能看到前面的 符号作用域是l ,代表local,也就是说这种情况下别的文件是不能使用这个符号的。
要想别的文件使用这个符号,必须使用extern const int yanjia = 10; ,这时候,使用objdump反汇编的结果就变成了: 可以供其他文件使用了。
但是其他文件要使用这个符号,仍然需要extern声明。比如另一个文件内容是:
int a = yanjia;
结果是编译报错: 必须要修改成:
extern const int yanjia;
int a = yanjia;
才能编译成功。
局部const变量
比如下面的代码,没有对yanjia这个变量取指:
#include <iostream>
#include <string>
using namespace std;
int main() {
const int yanjia = 10;
int shige = yanjia;
return 0;
}
先-g编译这个文件,然后objdump -S 来反汇编可执行文件,能得到下面的结果: int shige = yanjia 这一行的汇编语句是,将直接数10存放在%rbp-4中了,但是确实也给yanjia分配了内存%rpb-8
但如果是普通局部变量:
#include <iostream>
#include <string>
using namespace std;
int main() {
int yanjia = 10;
int a = yanjia;
return 0;
}
结果是 int b = yanjia; 这句就是先从内存中把yanjia的值取出放到%eax中,然后再移动到新的内存中。
|