哪个更优:`new`还是`calloc`?

时间:2014-02-20 11:38:19

标签: c++ windows memory-management heap

我使用calloc,我已经读过,calloc内部调用new处理程序,那么我该怎么办?

我应该使用new运算符(快速分配)还是calloc(也可以分配和初始化内存)?

4 个答案:

答案 0 :(得分:2)

这个问题无法真正回答,因为它基于错误的假设,new只是分配内存但不初始化它。相反的是:

new不仅分配内存(除非你使用“placement new”),它还调用一些对象构造函数。即new的作用远不止calloc

在C ++中,如果您觉得需要为例如分配一些内存一些可变大小的数组,首先考虑使用标准容器,例如喜欢

std::vector<char> buf( 1024 );

char *buf = new char[1024];

答案 1 :(得分:1)

callocnew无法真正比​​较;它更接近operator new(它们不一样)。 calloc会将分配的内存清零,而operator newmalloc则不会。 new在存储位置构建对象,但calloc没有。

// Using calloc:
my_object* p = static_cast<my_object*>(std::calloc(1, sizeof(my_object)));
::new(static_cast<void*>(p)) my_object(10);

// Using operator new:
my_object* p = static_cast<my_object*>(::operator new(sizeof(my_object)));
::new(static_cast<void*>(p)) my_object(10);

// using new:
my_object* p = new my_object(10);

答案 2 :(得分:1)

好吧,每个人都告诉过你new没有初始化内存等,但他们忘记了值初始化语法:

char *buffer = new char[size]();

所以我认为你总是使用new。如果要初始化内存,请使用上面的语法。否则,请删除括号。

答案 3 :(得分:0)

  

我应该使用new运算符(快速分配)还是calloc(也可以分配和初始化内存)?

在C ++中,你永远不应该使用* alloc memory函数(malloccallocfree等)。它们会导致您创建对C ++不安全的代码(对于C来说没问题)。

您还应该使用最专业(更高级别)的代码构造。

这意味着:

  • 更喜欢new / new[] / delete / delete[]而不是malloc / calloc / free
  • 更喜欢智能指针而不是原始指针
  • 更喜欢抽象原始指针数据(即使用std::vector / std::array / etc而不是new[]delete[],使用std::unique_ptr<T> / {{1}而不是std::shared_ptr<T>等等。