C++学习<1>程序分区

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在堆区开辟数据。

相关推荐
Wang's Blog18 小时前
Java 项目实战: 交友项目 - 喜欢与取消喜欢
java·开发语言·交友
stolentime18 小时前
CF2277E Tree Guessing题解
c++·算法·贪心算法·交互·ad-hoc
quantdash_cc19 小时前
如何检查滚动收益率计算中的窗口长度不足?——从数学定义到 Pandas 实现
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
衍生星球19 小时前
【Java 语言】— 方法(方法定义、调用、参数、返回值、方法重载)
java·开发语言·方法
CodeGL19 小时前
16、Python Web开发
开发语言·前端·python
喵了几个咪19 小时前
GoWind UBA 拆解:把 Doris UNIQUE KEY 翻译成 ClickHouse——读数正确性对齐实录
开发语言·后端·clickhouse·微服务·golang·gowind
FRing0319 小时前
JavaScript入门到精通二十九(内置构造函数(Object、Array))
开发语言·前端·javascript
syagain_zsx19 小时前
ODB 与 MySQL:C++ 里的 ORM 实践(类即表、事务铁律与查询封装)
开发语言·数据库·c++·mysql·工具库·1024程序员节
小鱼仙官19 小时前
使用Qt封装C/C++ 动态库 用于第三方调用
c语言·c++·qt
小嘉丶学长19 小时前
Day08 · 字符串(二)
服务器·开发语言·python·学习·1024程序员节