垃圾回收有哪些好处?这些好处在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
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();
}
};
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;
}
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];
}