为新操作员编写过载功能

时间:2011-11-17 22:54:03

标签: c++ operator-overloading new-operator

我写了一个简单的函数如下:

void *operator new(size_t size) throw(std::bad_alloc)
{
    void *p;
    p =  malloc(size);
    if(!p)
       throw bad_alloc();
    return p;
}

我还能做些什么来改善这个? malloc会比new更有效吗?如果我想写new[],我只需要更改函数签名吗?

3 个答案:

答案 0 :(得分:1)

这段代码将按照它的方式工作,如果你这样做,你几乎需要编写一个匹配的::operator delete代码:

void operator delete(void *block) throw() {
    ::free(block);
}

就个人而言,我可能会将您的代码修改为更像:

void *operator new(size_t size) throw(std::bad_alloc)
{
    void *p =  malloc(size);
    if(!p)
       throw bad_alloc();
    return p;
}

我更喜欢初始化我能做的一切,而不是创建一个未初始化的变量,然后才为它分配一个值。在这种情况下,差异很小,但我认为这是一种值得培养的习惯。

至于比operator new的默认实施更有效,我会说机会不是,它不会更有效,而且效果可能会更差。你提供的基本上是在C ++诞生之前实现了多少标准库,但从那时起,许多(大多数?)已经在::operator new的实现上做了更多的工作,以便更加贴近动态分配的方式内存往往在C ++中使用(其中malloc主要面向它在C中的使用方式,这通常至少有点不同)。

new[]而言,是的,它只是功能签名的变化。尽管用于单个与多个分配,但operator new和operator new []`的要求是相同的。

答案 1 :(得分:0)

如果您替换全局operator new,则还应替换nothrow变体。当然还有全局运算符delete(正常变量和非变量变量,因为如果对象的构造函数抛出,nothrow的{​​{1}}变体将被调用operator delete nothrow)。

我想在大多数实现中,内置operator new看起来或多或少与您的替代品完全相同。无论如何,总的来说,我不希望你能够击败operator new的内部实现。

答案 2 :(得分:0)

operator new负责分配对象的底层内存。某些应用程序使用除malloc之外的其他分配方案来分配内存。一个例子是池分配:应用程序从操作系统请求大量内存并管理内存本身的方式。这可以保证系统调用的开销,防止碎片或为操作系统通常不会的内存分配提供时间保证。

如果您不知道这是否可以改善您的计划的性能,那么对您来说可能无关紧要。

相关问题