C++内存分区模型超详细讲解
什么是内存分区模型
内存分区模型是指操作系统在运行程序时将可用的内存分为多个区域,每个区域有不同的作用和管理方式。在C++程序运行时,系统会按照一定的规则将内存分成以下几个区域:
- 栈区
- 堆区
- 全局/静态区
- 常量区
- 代码区
各区域的详解
栈区
栈(Stack)是一段连续的内存空间,由编译器自动管理。栈区内的数据大小和生命周期是可以预计的,并且有较小的空间限制。栈区内存的分配和释放是自动进行的,不需要程序员手动控制。局部变量、函数参数和返回值都存放在栈区内。
下面是栈区的示例代码:
#include <iostream>
using namespace std;
void func(int a, int b) {
int c = a + b;
cout << "c = " << c << endl;
}
int main() {
int a = 10;
int b = 20;
func(a, b);
return 0;
}
在这个例子中,函数func()
中的局部变量c
和main()
函数中的局部变量a
和b
都存放在栈区内。
堆区
堆(Heap)是由程序员手动管理的一块连续的内存空间,大小不受限制。堆区内的数据生命周期需要手动控制,需要手动分配和释放内存。堆区内存分配使用new
关键字,内存释放使用delete
关键字。
下面是堆区的示例代码:
#include <iostream>
using namespace std;
int main() {
int *p = new int(10);
cout << "*p = " << *p << endl;
delete p;
return 0;
}
在这个例子中,我们使用new
关键字分配了一块大小为4字节的内存空间,并且将其赋值为10。我们通过指针p
访问这块内存空间,并在最后使用delete
释放掉。
全局/静态区
全局/静态区是一块固定大小的内存空间,用于存放全局变量和静态变量。全局变量和静态变量的生命周期与程序运行时间相同。全局变量和静态变量的存储空间在程序的整个运行过程中都是存在的,不会随着函数的离开而被释放。
下面是全局/静态区的示例代码:
#include <iostream>
using namespace std;
int g; // 全局变量,被初始化为0
static int s; // 静态变量,被初始化为0
int main() {
static int ss; // 静态局部变量,被初始化为0
int a; // 自动变量,不被初始化
cout << "g = " << g << endl;
cout << "s = " << s << endl;
cout << "ss = " << ss << endl;
cout << "a = " << a << endl;
return 0;
}
在这个例子中,变量g
和变量s
被分别定义为全局变量和静态变量,它们的内存空间存放在全局/静态区内。变量ss
被定义为静态局部变量,其内存空间也分配在全局/静态区内。变量a
则被定义为自动变量,生存周期在main函数内。
常量区
常量区(也称只读数据区)存放常量的值,不允许对其修改。常量区内存放字符串常量、const修饰的常量和全局常量等。
下面是常量区的示例代码:
#include <iostream>
using namespace std;
int main() {
const char *p1 = "Hello";
char *p2 = new char[6];
const int a = 10;
static const double b = 3.14;
cout << "p1 = " << p1 << endl;
cout << "p2 = " << p2 << endl;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
delete[] p2; // 释放堆空间
return 0;
}
在这个例子中,p1
是一个指向字符串常量的指针,它所指向的字符串常量存放在常量区内。p2
是一个指向堆区的指针,我们在程序中没有为其赋值,因此p2
所指向的字符串为随机值。变量a
被定义为一个常量,其值为10,存放在常量区内。变量b
也被定义为一个常量,存放在全局/静态区内。
代码区
代码区存放程序的二进制代码,是只读的。
总结
C++内存分区模型将内存分为多个区域,每个区域有不同的作用和管理方式,程序员可以通过使用不同的内存分区来达到更好的程序性能和更灵活的内存管理。
以上就是C++内存分区模型的超详细讲解。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++内存分区模型超详细讲解 - Python技术站