C++内存分区

type right by Thomas Alan 光风霁月023 .XDU
C++ 的内存分区
一般的,C++ 内存分区为:数据段、代码段、BSS段、堆区、栈区
其中, BSS段相对于其他内存区域来说使用较少,而全局区(静态区)包括了BSS段和数据段中的已初始化静态变量,更符合实际编程中的使用情况,所以人们通常会直接把全局区(静态区)作为表示静态变量和全局变量的存储区域。

因此这里按照实用性总结为:栈区、堆区、全局区(静态区)、常量区、代码区。在描述完具体分区后,本文继续解释BSS段相关内容。

1)栈区:栈区用于存储函数的局部变量、函数的参数等数据,它的内存分配和释放是自动完成的,当函数调用结束时,栈区的内存会自动释放。栈区的空间相对较小,通常为几 MB,也不适合存储大量的数据。

2)堆区(自由存储区):堆区用于存储程序动态分配的内存,堆区的内存分配和释放需要手动完成,通过 new & delete (malloc & free) 关键字进行操作。堆区的空间相对较大,可以存储大量的数据,但是需要手动管理内存,否则容易出现内存泄漏和内存溢出等问题。很多编译器的new & delete都是以malloc & free为基础来实现的。

3)全局区(静态区):全局区用于存储全局变量和静态变量等数据,它的内存分配和释放在程序启动和结束时完成。全局区的空间相对较大,可以存储大量的数据,但是需要注意全局变量的作用域和生命周期等问题。

注:与普通局部变量不同的是,静态局部变量的生命周期与全局变量相同,即在程序开始时被创建,在程序结束时被销毁。
普通局部变量一般存在于栈区,如果使用new、malloc创建,那么自然在堆区。

4)常量区:常量区用于存储程序中的常量数据,包括字符串常量和数值常量等。常量区的内存分配在程序编译时完成,通常是只读的,不能修改其中的数据。

5)代码区:代码区用于存储程序的代码段,包括函数体和程序指令等。代码区的内存分配在程序编译时完成,通常是只读的,不能修改其中的数据。

注:Block Started by Symbol(BSS)可以翻译为“以符号开始的块”,它是一种存储未初始化全局变量和静态变量的段。BSS段通常在程序加载时被清零,因此不需要在可执行文件中占用磁盘空间,只是在程序加载时分配内存。
数据段包含已初始化的全局、静态变量、常量
BSS段包含未初始化的全局、静态变量。因此,在对未初始化的 BSS 段变量进行赋值时,会将其从 BSS 段移动到数据段。由于数据段和 BSS 段在内存中的位置是不同的,会导致内存的重新分配。但是,这种内存的重新分配只会在变量进行赋值时才会发生,一旦赋值完成,变量的内存位置就不会再改变了。

在 C++ 程序中,了解内存分区的特点和使用方式,可以更好地管理内存,避免内存泄漏和内存溢出等问题,提高程序的性能和稳定性。

你可能感兴趣的:(C++内存分区)