博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C/C++/JAVA内存布局
阅读量:5104 次
发布时间:2019-06-13

本文共 1154 字,大约阅读时间需要 3 分钟。

C与C++的内存机制虽然非常相似,但还是有一些不同的地方。下面让我们一起来看看它们到底有什么区别吧。

(一)C内存机制

1. 栈(Stack):
        位于函数内的局部变量(包括函数实参),由编译器负责分配释放,函数结束,栈变量失效。
2. 堆(Heap) :
        由程序员用malloc()/calloc()/realloc()分配空间,free()释放所申请的空间。如果程序员忘记free(),则会造成内存泄漏,程序结束时可能会由操作系统回收,也许就一直占用着直至关机。
3. 全局区/静态区(Global Static Area): 
        全局变量和静态变量存放区,程序一经编译好,该区域便存在。并且
在C语言中初始化的全局变量和静态变量和未初始化的放在相邻的两个区域(在C++中,由于编译器会给全局变量和静态变量自动初始化赋值,所以没有区分了)。由于全局变量一直占据内存空间且不易维护,推荐少用。程序结束时释放。 
4. C风格字符串常量存储区:
        专门存放字符串常量的地方,程序结束时释放。
有的书也叫符号表。
5. 程序代码区:
        存放程序二进制代码的区域。
 
(二)C++内存机制
1. 栈(Stack): 
        位于函数内的局部变量(包括函数实参),由编译器负责分配释放,函数结束,栈变量失效。
2. 堆(Heap): 
        这里与C不同的是,该堆是由new申请的内存,由delete负责释放。
3. 自由存储区(Free Storage): 
        由程序员用malloc()/calloc()/realloc()分配空间,由free()释放。如果程序员忘记free()了,则会造成内存泄漏,程序结束时可能会有操作系统回收,也许就一直占用着直至关机。
 与C的堆机制对应

4. 全局区/静态区(Global Static Area): 

         全局变量和静态变量存放区,程序一经编译好,该区域便存在。在C++中,由于编译器会给全局变量和静态变量自动初始化赋值,所以没有区分初始化和未初始化变量。由于全局变量一直占据内存空间且不易维护,推荐少用。程序结束时释放。

5. 常量存储区:

          这是一块比较特殊的存储区,专门存储不能修改的常量(如果采用非正常手段更改,当然也是可以的)。

特别注意:

为了验证上述,须在编译的时候增加选项-std=c89。为什么?如果没有加-std=c89这个选项,现在的gcc版本一般都是c99标准,c99中增加了很多C++的特性在里面。影响本文验证。

编译器实现问题,有的编译器会把初始化为0的全局或静态变量也作为未初始化的对待。大概是因为未初始化则编译器自动初始化为零的效果一样吧!

 

转载于:https://www.cnblogs.com/zhaoyl/archive/2012/10/05/2712519.html

你可能感兴趣的文章
uglify2之transform
查看>>
error C2259: 'CException' : cannot instantiate abstract class
查看>>
设计模式 单例模式的缺陷和补救办法及应用场景2
查看>>
UVA11722 Joining with Friend
查看>>
UVA11584 Partitioning by Palindromes
查看>>
Linux上安装JDK与Tomat
查看>>
HDU2089
查看>>
Vagrant 无法校验手动下载的 Homestead Box 版本
查看>>
gentoo 解除包屏蔽
查看>>
jvisualvm安装visualgc插件
查看>>
2019 计蒜之道 复赛 D. “星云系统”(单调栈)
查看>>
1、Reactive Extensions for .NET(译)
查看>>
POJ-3180 The Cow Prom(tarjan求强连通分量)
查看>>
201521123049 《JAVA程序设计》 第12周学习总结
查看>>
做隧道转发的 正反
查看>>
无序列表li横向排列
查看>>
[小明带你玩儿Photon]4.一起来看日志
查看>>
[转]为ReportViewer导出的PDF文档加上水印
查看>>
espresso Seekbar
查看>>
转:jquery获得select option的值 和对select option的操作
查看>>