C++内存详解
2015-09-05 15:55
330 查看
一.分配方式
在C++中,内存分为五个区:堆,栈,自由存储区,全局/静态存储区,常量存储区。
栈,在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时,这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
堆,就是那些由new分配的内存块,他们的释放编译器不会去管,由程序员自己去释放。
自由存储区,就是那些由malloc等分配的内存块,他和堆相似,不过他是用free来结束自己的生命的。
全局/静态存储区,全局变量和静态变量被分配到这块内存中。
常量存储区,这是一块比较特殊的存储区,里面存放的是常量,不允许被修改。
二.堆和栈的区别
1.管理方式不同
2.空间大小不同
3.碎片问题
4.生长方向不同
管理方式不同:对于栈来说,是由编译器自动管理,无需我们手动控制;对于堆来说,释放工作‘由程序员控制,容易产生内存泄漏。
空间大小不同:一般在32位系统下,堆内存可达到4GB,但是对栈来讲,一般都是有一定大小的。
碎片问题:对于堆来说,频繁的new/delete会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。而对于栈来说就不存在这个问题,因为栈是先进后出的队列,这里参考数据结构就知道了。
生长方向不同:对于堆来说,生长方向是向上的,也就是向着内存地址增加的方向;对于栈,它的生长方向是向下的。
在C++中,内存分为五个区:堆,栈,自由存储区,全局/静态存储区,常量存储区。
栈,在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时,这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
堆,就是那些由new分配的内存块,他们的释放编译器不会去管,由程序员自己去释放。
自由存储区,就是那些由malloc等分配的内存块,他和堆相似,不过他是用free来结束自己的生命的。
全局/静态存储区,全局变量和静态变量被分配到这块内存中。
常量存储区,这是一块比较特殊的存储区,里面存放的是常量,不允许被修改。
二.堆和栈的区别
1.管理方式不同
2.空间大小不同
3.碎片问题
4.生长方向不同
管理方式不同:对于栈来说,是由编译器自动管理,无需我们手动控制;对于堆来说,释放工作‘由程序员控制,容易产生内存泄漏。
空间大小不同:一般在32位系统下,堆内存可达到4GB,但是对栈来讲,一般都是有一定大小的。
碎片问题:对于堆来说,频繁的new/delete会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。而对于栈来说就不存在这个问题,因为栈是先进后出的队列,这里参考数据结构就知道了。
生长方向不同:对于堆来说,生长方向是向上的,也就是向着内存地址增加的方向;对于栈,它的生长方向是向下的。
相关文章推荐
- Effective C++——条款22(第4章)
- 简单的C++游戏载入界面设计
- c++のeof
- effective c++ 尽量以const enum inline 替换 #define
- C语言怎么将用户账号密码写入文件实现登录注册功能?
- C语言怎么将用户账号密码写入文件实现登录注册功能?
- C++中的虚基类
- iOS求职之C语言面试题
- C++蜗牛
- 【C++】类的特殊成员变量+初始化列表
- c++运算符重载
- 漫谈C指针第七讲---const int *pi 的语义
- 理解临时对象的来源(More Effective C++_19(效率))
- C++之成员函数的重载,覆盖,隐藏
- POJ C++程序设计 编程题#1 编程作业—STL1
- C++设计模式-Command命令模式
- 【C++】默认构造函数
- HDU 2072 单词数 -- C++ string set 统计不同的单词数目
- 【more effective c++读书笔记】【第5章】技术(4)——Smart Pointers(智能指针)
- 【more effective c++读书笔记】【第5章】技术(4)——Smart Pointers(智能指针)