malloc/free new/delete(原创奥~~)
原文链接:http://user.qzone.qq.com/408361617/blog/1339174497#!app=2&pos=1339174497
好久不写C++了,晚上和人讨论着这两套东西的区别,忍不住卖弄一下。好吧,好歹都1年没写过C/C++了。
毋庸置疑,new会调用malloc的,但是是不是每一个new都会调用malloc呢?其实不是的,同样的问题请类比fwrite和write。所以认为由于new会调用malloc推得 new的效率比malloc差的想法是片面的,一切都要看情况。
两个疑点:
1. 是不是所有的new都会调用malloc?
2.是不是所有的new都会调用构造函数?
简单的看一段代码:
const unsigned int MAX_LOOPS = 1024*256;
const unsigned int MAX_BUFF = 128;
typedef struct Object {
int index;
int properties;
char * name;
} Object;
Object * array[MAX_LOOPS];
...
clock_t start, finish;
double duration;
int sum = 0;
start = clock();
for ( int i= 0; i < MAX_LOOPS; ++ i){
array[i] = new Object();
array[i]->index = 1;
sum += array[i]->index;
}
finish = clock();
duration = (double)(finish - start) / CLOCKS_PER_SEC;
printf( "num = %d; %2.1f seconds\n", sum,duration );
...
start = clock();
for ( int i= 0; i < MAX_LOOPS; ++ i){
array[i] = (Object *)malloc(sizeof(Object));
array[i]->index = 1;
sum += array[i]->index;
}
finish = clock();
duration = (double)(finish - start) / CLOCKS_PER_SEC;
printf( "num = %d; %2.1f seconds\n", sum,duration );
塞到vs里面跑一下吧~~~,至少我的结果是malloc惜败。。为啥呢?原因有两个:
1.不是所有的new都会调用malloc,new本身会使用allocator去分配一个内存池,至少对于小内存的new,它会分配一个较大内存空间并对这些内存进行管理,话说其实就是桶装的内存池管理。
2.不是所有的new都会调用构造函数~~~,对于"无聊的构造函数",new是懒得去调用。当然程序员也可以认为new去调用了构造函数,但实际上new比它看上去聪明的多。
我们可以用下面这个例子来说明该问题。
Object * pArray;
start = clock();
for ( int i = 0; i < MAX_LOOPS; ++ i){
pArray = (Object *)malloc(sizeof(Object) *MAX_BUFF);
int idx = i%MAX_BUFF;
(pArray+idx)->index = -1;
sum -= (pArray-idx+MAX_BUFF-1)->index;
free(pArray);
}
finish = clock();
duration = (double)(finish - start) / CLOCKS_PER_SEC;
printf( "num = %d; %2.1f seconds\n", sum,duration );
start = clock();
for ( int i = 0; i < MAX_LOOPS; ++ i){
pArray = new Object[MAX_BUFF]();
int idx = i%MAX_BUFF;
(pArray+idx)->index = -1;
sum -= (pArray-idx+MAX_BUFF-1)->index;
delete []pArray;
}
finish = clock();
duration = (double)(finish - start) / CLOCKS_PER_SEC;
printf( "num = %d; %2.1f seconds\n", sum,duration );
如果new确实会调用所有的构造函数的话,那么malloc会比new快得多,但是实际上,速度是类似的,至少在我看来是这样。
当然这一切都不能说明malloc/free会比new/delete慢,应为malloc的使用者大概会自己管理好自己的空间,我想说的仅仅是new/delete可能没有它看起来的那么没有效率而已。如果有人企图仅仅通过malloc替换new达到加速的效果的话,我猜他会多少有点失望。