C++中内存分区及其作用分析

术语

内存四大区:

  • 代码区:存放函数体的二进制代码,由操作系统进行管理的
  • 全局区:存放全局变量和静态变量以及常量
  • 栈区:由编译器自动分配释放, 存放函数的参数值,局部变量等
  • 堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收

内存的低地址与高地址:

低地址:存放在内存中地址小的位置(存放中的变量和数据)

高地址:存放在内存中地址大的位置(存放程序指令)

C++中内存分区及其作用分析

一、文本区(Text Segment)/代码区

也称为代码段,存放程序代码。在程序编译以后,代码被编译成机器码,并保存在Text Segment中。它通常是只读的,防止程序出现意外的修改。同时,代码段也是可共享的。多个相同的程序可共享同一份代码,从而节省内存空间。

二、数据区(Data Segment)/全局区

也称为静态数据区,存放定义的全局变量、静态变量等数据。数据区也分为两个部分,即初始化数据段和未初始化数据段。初始化数据段存放已经初始化过的全局变量和静态变量。未初始化数据段存放未经初始化的全局变量和静态变量,该区域的值默认为0。

三、栈区(Stack Segment)

栈区存放函数调用时的局部变量、参数等数据,系统根据函数调用的嵌套情况来自动管理栈区。当一个函数被调用时,函数的参数和返回地址被压入栈中,然后分配一定的栈空间存储局部变量。当函数返回时,返回值和之前压入栈中的返回地址被取出,栈空间被释放。在栈区分配变量和空间时,会从高地址往低地址分配内存。这是因为栈区存储数据的方式类似于数据的堆叠,后压入的数据会被放在先前数据的上面,而先压入的数据会被放在下面。每次分配栈内存时,栈指针会向下移动,每次释放栈内存时,栈指针会向上移动。(自顶向下分配内存)

四、堆区(Heap Segment)

动态分配内存的区域,程序员在程序运行时可以向操作系统申请一定大小的内存。在堆区分配的内存由程序员负责管理,使用完毕后,程序员需要调用释放内存系统来释放内存,以防止内存泄漏的发生。在堆区分配内存时,会从低地址往高地址分配,因为操作系统在分配空间时会记录哪些空间已经被分配出去。所以在分配时需要先查找堆区中未被分配的内存空间,并且需要记录本次分配所占用的空间大小和地址。(自底向上分配内存)

举例

//全局区
int global_variable = 0;//全局变量
static int static_variable = 1;//静态变量
const int global_const_variable = 10;//全局常量
int main() {
	//栈区
    int local_variable = 2;
	const int const_variable = 0;
	//堆区
	int* ptr = (int*)malloc(sizeof(int));//c语言形式在堆区 1 个 int 类型变量的内存空间	
	free(ptr);// 释放指针 ptr 指向的内存空间
	int* p = new int[10]; // C++在堆区申请 10 个 int 类型变量的内存空间	
	delete[] p; // 释放指针 p 指向的内存空间
    return 0;
}

那么在编译后,程序将被划分为四个区域:

代码区:

存放main函数的机器码。

全局区:

存放定义的全局变量global_variable和静态变量static_variable。其中,global_variable存放在初始化数据段,static_variable存放在未初始化数据段。

堆区:

在程序运行过程中,可以使用mallocnew函数向堆区申请一定大小的内存空间。

栈区: 存放main函数的局部变量local_variable、函数参数和返回地址等数据。

到此这篇关于C++中内存分区及其作用分析的文章就介绍到这了,更多相关C++内存分区内容请搜索aitechtogether.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持aitechtogether.com!

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(1)
xiaoxingxing的头像xiaoxingxing管理团队
上一篇 2023年5月13日 上午9:09
下一篇 2023年5月24日 下午8:36

相关推荐