首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

垃圾回收有哪些好处?这些好居于C++中是无法获得的么

2013-08-14 
垃圾回收有哪些好处?这些好处在C++中是无法获得的么?本帖最后由 shendaowu 于 2013-07-27 08:41:30 编辑我

垃圾回收有哪些好处?这些好处在C++中是无法获得的么?
本帖最后由 shendaowu 于 2013-07-27 08:41:30 编辑 我刚才搜了,没搜到特别多的东西。
另外在真实的C++开发中,需要编写很多析构函数么?默认的析构函数是否足够?真实的C++开发中编写的对象经常会使用new,打开文件,动态申请一些需要释放的资源么?
[解决办法]
我忘了回答你的问题,我不知道缺了GC会让c++有什么很大的不便(其实你可以自己实现GC,而且C++2017应该会加入GC)
但是我可以告诉你c++配合RAII和template能做到什么纯GC的语言做不到的事情

长话短说,c++的destructor配合template
可以让你有能力处理任何resources
而GC类的语言仅限于memory

这有什么好处呢?
例子一 : 


vector<ifstream> produce()
{
  vector<ifstream> ans;
  for (int i = 0;  i < 10; ++i) {
    ans.emplace_back(name(i));
  }
  return ans;
}
 
void consumer()
{
  vector<ifstream> files = produce();
  for (ifstream& f: files) {
    read(f);
  }
} // close all files

你要如何用 ‘using’ or ‘try-with-resources’ statement来回收他们?

例子2, mutex

struct ConcurrentSafeCounter {
    std::mutex mutex;
    Counter counter;
 
    void increment(){
        std::lock_guard<std::mutex> guard(mutex);
        counter.increment();
    }
 
    void decrement(){
        std::lock_guard<std::mutex> guard(mutex);
        counter.decrement();
    }
};

使用了destructor配合template
程序可以保证一定会被解锁
若你要对multithread进行更详尽的reousrce控制
c++可比GC类语言来得更方便

在现代c++的设计中,new和delete是鲜少使用的
多利用标准库,或者是自己动手写些简单的资源管理工具(RAII+简单的template)
才是高手们推荐的风格。如果你怀疑那些大师级人物的实力
那我请问你,中国这么多年来开发出什么著名的c++库?
那些著名的c++开源库,projects都是由那些人弄出来的?
为何他们都不肖“c with classes”?

要知道更详细的可以到这阅读,我有部分例子也是抄这里的

c++ best features
http://akrzemi1.wordpress.com/2013/07/18/cs-best-feature/#comment-1448
[解决办法]
我拿openCV做例子,那些把c++当成"c with classes"的人会设计出这种东西


double calcGradients(const IplImage *src, int aperture_size = 7)
{
    CvSize sz = cvGetSize(src);
     
    IplImage* img16_x = cvCreateImage(sz, IPL_DEPTH_16S, 1); 
    IplImage* img16_y = cvCreateImage(sz, IPL_DEPTH_16S, 1);  
    cvSobel(src, img16_x, 1, 0, aperture_size);
    cvSobel(src, img16_y, 0, 1, aperture_size);
     
    IplImage* imgF_x = cvCreateImage(sz, IPL_DEPTH_32F, 1);
    IplImage* imgF_y = cvCreateImage(sz, IPL_DEPTH_32F, 1);
    cvScale(img16_x, imgF_x);
    cvScale(img16_y, imgF_y);    
     
    IplImage* magnitude = cvCreateImage(sz, IPL_DEPTH_32F, 1); 
    cvCartToPolar(imgF_x, imgF_y, magnitude);
    double res = cvSum(magnitude).val[0];
     
    cvReleaseImage(&magnitude ); 
    cvReleaseImage(&imgF_x);
    cvReleaseImage(&imgF_y);
    cvReleaseImage(&img16_x);
    cvReleaseImage(&img16_y);
     
    return res;
}


那么modern c++长什么样子?


double contrast_measure(Mat& img)
{
    Mat dx, dy;
    Sobel(img, dx, 1, 0, 3, CV_32F); 
    Sobel(img, dy, 0, 1, 3, CV_32F); 
    magnitude(dx, dy, dx);
     
    return sum(dx)[0];
}


上述代码还不含异常处理呢,连哪都要考虑的话"c with classes"会更麻烦
有人或许会说,“第一种的效能更好”,对不起,根本没有这回事
openCV1的性能不比openCV2高
第一种不但代码量多,也更难维护,更容易出错

除非你跟linus或其他c的疯狂信徒一样,是“c语言至高教”的信徒
否则我看不出有什么理由在2013年的今天还坚持“c with classes”

热点排行