C/C++内存布局方式
来源:互联网 发布:手动添加网络ssid 编辑:程序博客网 时间:2024/05/22 06:47
转自:http://blog.sina.com.cn/s/blog_8441efe20100t10j.html
在C/C++中,内存中数据存储分成4个区,分别是堆、栈、全局/静态存储区和常量存储区。
|----------------------|
|
|----------------------|
|
|----------------------|
|
|
|
|
|
|----------------------|
|
|----------------------|
|
|----------------------|
|
|----------------------|
|
|----------------------|
区分堆与栈:
注意:Reserve最小值为4Byte;commit是保留在虚拟内存的页文件里面,它设置的较大会使栈开辟较大的值,可能增加内存的开销和启动时间。
总之,堆和栈相比,由于大量new/delete的使用,容易造成大量的内存碎片;由于没有专门的系统支持,效率很低;由于可能引发用户态和核心态的切换,内存的申请,代价变得更加昂贵。
转自:http://blog.csdn.net/imyfriend/article/details/8497103
对任何一个普通C++程序来讲,它都会涉及到5种不同的数据段。常用的几个数据段种包含有“程序代码段”、“程序数据段”、“程序堆栈段”等。不错,这几种数据段都在其中,但除了以上几种数据段之外,进程还另外包含两种数据段。下面我们来简单归纳一下进程对应的内存空间中所包含的5种不同的数据区。
代码段:代码段是用来存放可执行文件的操作指令,也就是说是它是可执行程序在内存种的镜像。代码段需要防止在运行时被非法修改,所以只准许读取操作,而不允许写入(修改)操作——它是不可写的。
数据段:数据段用来存放可执行文件中已初始化全局变量,换句话说就是存放程序静态分配的变量和全局变量。
BSS段:BSS段包含了程序中未初始化全局变量,在内存中bss段全部置零。
堆(heap):堆是用于存放进程运行中被动态分配的内存段,它大小并不固定,可动态扩张或缩减。当进程调用malloc/new等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)
栈:栈是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味这在数据段中存放变量)。除此以外在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也回被存放回栈中。由于栈的先进先出特点,所以栈特别方便用来保存/恢复调用现场。从这个意义上将我们可以把堆栈看成一个临时数据寄存、交换的内存区。
我们要知道,栈中存放的是一个个被调函数所对应的堆栈帧,当函数fun1被调用,则fun1的堆栈帧入栈,fun1返回时,fun1的堆栈帧出栈。什么是堆栈帧呢,堆栈帧其实就是保存被调函数返回时下一条执行指令的指针、主调函数的堆栈帧的指针、主调函数传递给被调函数的实参(如果有的话)、被调函数的局部变量等信息的一个结构。
首先,我们要说明的是如何区分每个堆栈帧,或者说,如何知道我现在在使用哪个堆栈帧。和栈密切相关的有2个寄存器,一个是ebp,一个是esp,前者可以叫作栈基址指针,后者可以叫栈顶指针。对于一个堆栈帧来说,ebp也叫堆栈帧指针,它永远指向这个堆栈帧的某个固定位置(见上图),所以可以根据ebp来表示一个堆栈帧,可以通过对ebp的偏移加减,来在堆栈帧中来来回回的访问。esp则是随着push和pop而不断移动。因此根据esp来对堆栈帧进行操作。
再来讲一下上图,一个堆栈帧的最顶部,是实参,然后是return address,这个值是由主调函数中的call命令在call调用时自动压入的,不需要我们关心,previousframe pointer,就是主调函数的堆栈帧指针,也就是主调函数的ebp值。ebp偏移为正的都是被调函数的局部变量。
- C/C++内存布局方式
- c程序内存布局
- C/C++ 内存布局
- Objective-C内存布局
- C/C++ 内存布局
- Objective-C内存布局
- Objective-C内存布局
- C - 内存布局
- C语言内存布局
- C语言内存布局
- Objective-C内存布局
- C/C++ 内存布局
- Objective C内存布局
- Objective-C内存布局
- C的内存布局
- Objective-C内存布局
- Objective-C内存布局
- c/c++ 内存布局
- Spring3+Hibernate4 配置多个数据源的方法
- 我觉得我努力画画终于有了意义
- 这机器人的面部肌肉抽搐了一下
- 在GitHub上分享和展示你的代码
- 双色汉诺塔问题
- C/C++内存布局方式
- 二叉排序树
- 关于析构函数和纯虚函数
- Codevs 1013 求先序排列
- 解决安装jdk后使用cmd校验出现has value '1.8',but'1.7' is required.的方法
- hdu1015——Safecracker
- 深入剖析c++指针
- 游戏服务器集群设计思路
- java解析xml文件