哪个更优化:`new` 或 `calloc`? [复制]

Posted

技术标签:

【中文标题】哪个更优化:`new` 或 `calloc`? [复制]【英文标题】:Which is more optimal: `new` or `calloc`? [duplicate] 【发布时间】:2014-03-21 07:51:02 【问题描述】:

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

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

【问题讨论】:

malloc vs new。如果您想像 calloc 那样初始化内存,请使用 memset。 calloc(以及 malloc 和 realloc)在 C++ 中不允许调用 operator new "如果需要快速分配,使用new;如果需要初始化内存,使用calloc"。没有上下文就没有绝对的“最佳”。 more optimal 没有意义,要么是 optimal - 要么不是。 operator new 是 C++,而 calloc 不是。到目前为止,没有太多理由说明哪个更优化,因为其中只有一个是正确的 【参考方案1】:

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

new 不仅分配内存(除非你使用“placement new”),它还调用一些对象的构造函数。 IE。 newcalloc 做得更多。

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

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

结束

char *buf = new char[1024];

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

calloc 无法与new 相比;它更接近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);

【讨论】:

【参考方案4】:

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

在 C++ 中,您永远不应该使用 *alloc 内存函数(malloccallocfree 等)。它们会引导您创建对 C++ 不安全的代码(对 C 来说很好)。

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

这意味着:

更喜欢new/new[]/delete/delete[]而不是malloc/calloc/free 更喜欢智能指针而不是原始指针 优先使用抽象而不是原始指针数据(即使用std::vector/std::array/etc 代替new[]delete[],使用std::unique_ptr&lt;T&gt;/std::shared_ptr&lt;T&gt; 代替T* 等。

【讨论】:

以上是关于哪个更优化:`new` 或 `calloc`? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

C ++中的“new”和“malloc”和“calloc”有啥区别? [复制]

关于memalign和malloc的区别

calloc vs new 用于各种编译器中的复杂结构

Calloc分配不一致

内存动态分配之realloc(),malloc(),calloc()与new运算符

Java 中的 clone( ) 和 new,哪个效率更高?