c++中的堆和栈

c++中如何利用好堆和栈,关系到程序的执行效率。就大小来说,程序作用栈的大小是固定的,取决于编译器。而堆的大小则是来自操作系统中的虚拟内存,从容量上来说肯定要比栈大得多,这样在C++中也就可以利用堆存储大容量的数据 以及对象,在C++或者C里面可以使用new或者malloc在虚拟内存中动态的申请空间,这部分空间就交给了用户,包括申请使用以及撤消 ,但是这也就带来了另外一个问题,请看下面的程序:

class a

{

   public:

       void  pointer(){

            int * i=new(10000);

.........

}

void output()

{

cout<<i<<endl;

}

} ;                  

程序中,动态申请了10000字节的空间,但是并没有对它进行释放,那会出现什么样的问题呢?在 output()函数中进行了输出,结果是什么呢?d在函数pointer()函数中我们定义了一个int*变量,它是局部变量,让我们看看这时i和*i的存储位置:i 存储的是申请的空间的地址存储于栈空间中,而i 指向的内容则是存储在堆中的。在pointer()函数结束之后 ,作为局部变量的i在栈空间中自动被消除,但是指针没有了,指针指向的空间依然存在(原本要用画个图来让大家看得更清楚的,可是太麻烦了,呵呵),这也就造成了内存的泄露,也就是说由于那个地址空间的内容依然存在,也就不会再把这个空间分配给另外的程序了。所以要及时的小心地释放掉申请的内容。

如果从效率上说那又会怎么样呢?栈上的内容是系统自动分配的,压栈和出栈也有专门的指令进行操作,效率很高,而且分配的空间都是连续的,也就不会产生内存碎片,而使用new或malloc动态申请的内存(虚拟内存)则是按一定的算法在堆空间中寻找合适大小的空间堆,并修改相应的维护堆空间的链表(不懂?还好操作系统课程里面有这方面的内容,在此就不深入了),然后返回地址给程序,效率低,容易产生内存碎片。当然也会产生缺页中断。但是动态申请内存有时又是必须的,比如存储较大空间的数据和对象就不得不用堆。

在编程中应该如何控制程序所用的内存空间以优化程序呢?先看看程序是如何使用内存的:

全局、静态变量存储在全局/静态数据区

常量数据区中存储程序中的常量字符串等

自动变量或者局部变量以及传递的函数参数存储在栈中,而堆存储动态数据

由此,非静态数据成员是影响对象占据内存大小的主要因素

所有对象共享一份静态数据成员

静态成员函数和非静态成员函数不会影响对象的大小

如果对象中包含虚函数,会增加4个字节的空间(为什么?因为虚函数有个虚函数表啊),不论有多少个虚函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值