C++的代码程序可以分为下面四个区:
(1)代码区:
存放函数体二进制代码,由操作系统管理
(2)全局区:
存放全局变量、静态变量、常量。
(3)堆区:
由程序员自行划分和释放,如果不释放堆区则会由操作系统自动释放
(4)栈区:
编译器自动分配,函数参数和局部变量均属于栈区。
详解:
(1)代码区
在程序未执行前:
代码区可存放CPU机器指令,具有共享和只读的特点。
共享指的是:内存共用一份代码。
只读指的是:不可修改代码,防止意外篡改指令。
(2)全局区
存放:局部变量、全局变量、const修饰的全局常量、字符串常量。
验证:
cpp
#include <iostream>
using namespace std;
//全局变量
int g_a = 10;
int g_b = 10;
//全局静态常量
static int s_g_a = 10;
static int s_g_b = 10;
//const修饰的全局常量
const int c_g_a = 10;
const int c_g_b = 10;
int main()
{
//局部变量
int a = 10;
int b = 10;
cout << "局部变量a的地址是:" << &a << endl;
cout << "局部变量b的地址是:" << &b << endl;
//const修饰的局部常量
const int c_l_a = 10;
const int c_l_b = 10;
cout << "const修饰的局部常量c_l_a的地址是:" << &c_l_a << endl;
cout << "const修饰的局部常量c_l_b的地址是:" << &c_l_b << endl;
//全局变量的地址
cout << "全局变量g_a的地址是:" << &g_a << endl;
cout << "全局变量g_b的地址是:" << &g_b << endl;
//全局静态变量的地址
cout << "全局静态变量s_g_a的地址是:" << &s_g_a << endl;
cout << "全局静态变量s_g_b的地址是:" << &s_g_b << endl;
//静态变量
static int s_a = 10;
static int s_b = 10;
cout << "静态变量s_a的地址是:" << &s_a << endl;
cout << "静态变量s_b的地址是:" << &s_b << endl;
//常量(字符串常量和const修饰的全局常量)
cout << "字符串常量Hello World的地址是:" << &"Hello World" << endl;
cout << "const修饰的全局常量c_g_a的地址是:" << &c_g_a << endl;
cout << "const修饰的全局常量c_g_b的地址是:" << &c_g_b << endl;
return 0;
}


局部变量和const修饰的局部常量不存放在全局区中。
总结:C++在程序运行前分为代码区和全局区。
(3)栈区
局部变量、函数的形参都存放于栈区上。
因此,在函数中,不要返回局部变量的地址,栈区开辟的数据由操作系统自动释放
(4)堆区
堆区由程序员自动管理,结束时由OS回收
程序员可以使用new在堆区开辟数据。