前言概述每天 5 分钟,学习一个 C++ 八股文知识点。 内存分区C/C++ 中内存是 C++ 面试中常考的一个知识点。在 C/C++ 中,内存的概念非常重要,因为它直接关系到程序的性能和可靠性。 C/C++ 中内存分区总结背景C++ 中最基本的存储单位是字节,C++ 中所有的数据都是由对象组成的,每一个对象都包含了一个或多个内存位置。 C++ 中有多种不同类型的内存区域,不同区域存放不同的数据,赋予数据不同的生命周期。
程序在执行时将供用户使用内存大致划分为以下区域:常量数据区、全局/静态数据区、栈区、堆区、自由存储、代码区。 常量数据区常量数据区主要用于存储字符串常量或者其他在编译期就已经知道的数据。 常量数据区中的数据在程序结束后由操作系统进行释放。
全局/静态数据区- 全局/静态数据区中的数据在程序结束后由操作系统释放。
- 未初始化的静态变量会被程序自动初始化为 0,静态局部变量在程序执行到该对象的声明处时被首次初始化。
栈区- 栈内存分配运算内置于处理器的指令集,效率高、但是分配的内存容量有限。
自由存储- 自由存储是动态内存区域,通过 new/delete 来分配和释放。
- 分配空间时,编译器根据指定类型自动分配空间大小,并调用构造函数进行初始化。
- 释放空间时,编译器会调用析构函数,并回收内存空间。
堆区- 堆是动态内存区域,通过 malloc/free 来分配和释放。
- 分配空间时,需要显示指定空间大小,不会调用构造函数。
- 释放空间时,编译器不会调用析构函数,只是释放内存空间。
代码示例#include 'iostream' #include <iomanip>
using namespace std;
constexpr int c_a = 10; const int c_b = 2;
int g_a = 10; static int s_g_b = 10;
int main() { static int s_l_c = 0;
int l_a = 2; const int l_c_b = 3; constexpr int l_c_c = 10;
int * p_a = new int(10); void * p_b = malloc(sizeof(int));
cout << '=========常量数据区======' << endl; cout <<setw(30) << left << '字符串常量 hello 地址:'<< static_cast<const void*>('hello') << endl; cout <<setw(30) << left << '常量表达式 c_a 地址:' << &c_a << endl; cout << setw(30) << left << '全局常量 c_b 地址:' << &c_b << endl; cout << '=========全局数据区======' << endl; cout << setw(30) << left << '全局变量 g_a 地址:' << &g_a << endl; cout << setw(30) << left << '静态全局变量 s_g_b 地址:' << &s_g_b << endl; cout << setw(30) << left << '静态局部变量 s_l_c 地址:' << &s_l_c << endl; cout << '=========栈区======' << endl; cout << setw(30) << left << '局部变量 l_a 地址:' << &l_a << endl; cout << setw(30) << left << '局部常量 l_c_b 地址:' << &l_c_b << endl; cout << setw(30) << left << '局部常量表达式 l_c_c 地址:' << &l_c_c << endl; cout << '=========自由存储======' << endl; cout << setw(30) << left << '指针 p_a 指向地址:' << p_a << endl; cout << '=========堆区======' << endl; cout << setw(30) << left << '指针 p_b 指向地址:' << p_b << endl; cout << '=========代码区======' << endl; cout << setw(30) << left << 'main 函数地址:' << main << endl;
system('pause'); return 0; }
运行结果如下:
|