C++中,内存区域共划分为5类
1、堆
由自己管理内存的分配、释放,通常用new分配内存,delete释放内存,自己在程序中没有释放内存时程序结束时操作系统也会自动回收所有内存,使用时要特别注意
2、栈
编译器会自动管理内存,通常有局部变量,函数参数等
3、自由存储区
由malloc分配的内存块,用free释放内存,和堆相似
4、常量区
存放常量,不允许修改(实际可以用非常规方法修改)
5、全局静态区
存放全局变量和静态变量
堆栈的对比
1、频繁的new/delete会使堆容易造成内存碎片,栈不存在这个问题
2、堆是向着高地址增长的,栈是向着低地址增长的
3、计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行。堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。
const int n = 80; const int &nRef = n; const int *pInt = &n; int *p = const_cast<int*>(pInt); *p = 9; std::cout<<n<<std::endl; // 打印出来为80,编译器已经将n替换为80 std::cout<<nRef<<std::endl; // 打印出来为9