加载中…
个人资料
南冠彤
南冠彤
  • 博客等级:
  • 博客积分:0
  • 博客访问:415,028
  • 关注人气:59
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

(转)关注内存 提高软件性能

(2011-06-16 18:24:29)
标签:

杂谈

分类: CPP/C

本文主要讨论2个问题:

1.      C++中的gc(垃圾回收)问题.

2.      如何提高内存的使用效率,改善程序的性能

一.  C++中的gc

在java,c#中在创建对象的时候,你只需要调用new,而根本不需要去delete.因为这项工作交给由语言内嵌的机制实现了.当一个对象不用的时候,会由这种机制来实现垃圾收集,把资源归还给os的任务.而c++就没这么幸运了.你必须自己负责显示的条用new,delete来显示负责资源的分配和资源的回收.稍有不慎就会出现memory leak.memory leak的严重性我就不说了.我想在这里实现的东西是想讲讲几种gc实现的思路.或者谈不上是垃圾回收吧.只是想做到象java,c#里面一样,只用显示调用new,而不用delete,在对象生命终结的时候会自动释放内存.我想用比较简单的代码来模拟这种思路.

最经典的就是智能指针吧.或者我下面的思路有点象智能指针.呵呵.不过是个简

化的了.

 

 

#include<iostream>

using namespace std;

 

class smpPointer

{

public:

       smpPointer(void * p) { _p = p;

       }

       ~smpPointer() { delete _p;

       }

private:

       void* _p;

};

class A

{

public:

       A(){ cout<<"Ctor();";

       }

      

};

void main()

{

       A* pointer = new A;

      

       smpPointer ptr(pointer);

      

}

上面这种实现看起来总是有点不自然,调用new之后必须在栈上分配一个smppointer对象.当程序退出的时候(或者函数运行完毕时候),栈上的对象会销毁,这样就可以自动调用smppointer的析够函数,从而释放内存了.

我们再看下面的版本.基本思路是这样的:用一个链表把每次对象分配的时候分配在何处的位置记下来,放在一个链表中.最后统一回收.实现这种思路的时候,必须为每1个需要改特性的类重载new,delete操作符.也不是很好.

 

 

版本2

 

#include<iostream>

#include <list>

using namespace std;

 

 

list<void*> memlist;//分配内存块的指针所链接成的双向链表

 

class A

{

public:

       A() { cout<<"ctor A\n";

       }

       ~A(){ cout<<"detor A\n";

       }

 void*     operator new(size_t size)

 {

        void* p = malloc(size);

        memlist.push_front(p);

        return p;

 }

 void operator delete(void *p)

 {

        free(p);

 }

};

void Destroy()

{

      

 

       memlist.clear();

      

}

 

void fun()

{

       A* pa = new  A;

       A* pb = new A;

       A* pc = new A;

       cout<<"memlist has: " << memlist.size() <<endl;

       Destroy();

}

 

void main()

{

    fun();

    cout<<"now memlist has  "<< memlist.size();   

}

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/loyalzu/archive/2004/05/07/17666.aspx

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有