malloc/free new/delete

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达到加速的效果的话,我猜他会多少有点失望。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值