汇编代码看数据存储
程序运行时分为存储区域分为
1、代码区------------>存放代码指令,包括除字符串常量的字面值
2、静态存储区------>存放静态变量和全局变量------------------------>执行main之前就分配好了------------->系统回收
3、字符串常量区--->存放字符串常量------------------------------------>执行main之前就分配好了-------------->系统回收
4、栈区--------------->局部变量,空间连续------------------------------>边执行边分配---------------------------->程序自己回收
5、堆区--------------->malloc,new指令分配点空间(不连续)------->边执行边分配---------------------------->delete或free回收,否则要到程序结束后系统回收。
字符串字面值,什么时候才会存放到字符串常量区
const char *p1 = "hello"; // 只有将字符串字面值赋给一个const char指针时,由于没有为字符串字面值在栈分配空间,就会把字符串字面值储存到字符串常量区。 const char *p2 = "hello" // 字符串常量区的相同字符串,只有一份,p1和p2指针指向相同的地址。 char ch[] = "hello"; // 为字面值在栈区分配了6个char的空间(包括一\0),所以这个时候"hello"是存放在代码区,程序执行到这条代码时,才会分配栈空间,并把字面值从代码区拷贝到栈区。
const不改变数据的存放位置,只是用于指导编译器检查改变量是否有被写的情况,有的话报错,运行时与平台变量存放一样。
const int a = 10; int b = 10; // a b都是存储在栈区。
C++程序
int glob = 10; int main() { const char *p1 = "123"; const char *p2 = "abcd"; const char *p3 = "abcd"; static char p4[6] = "xxx"; static char p5[7]; const char p6[] = "hello"; char p7[] = "xyzx"; p5[0] = 1; char *p8 = new char[10]; return 1; }
汇编程序
编译命令:g++ -S test.cpp -o test.s