汇编代码看数据存储

程序运行时分为存储区域分为

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

12-25 08:25