哪个更优化:`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。 new
比 calloc
做得更多。
在 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 new
和 malloc
不会。 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 内存函数(malloc
、calloc
、free
等)。它们会引导您创建对 C++ 不安全的代码(对 C 来说很好)。
您还应该尽可能使用最专业(更高级别)的代码结构。
这意味着:
更喜欢new
/new[]
/delete
/delete[]
而不是malloc
/calloc
/free
更喜欢智能指针而不是原始指针
优先使用抽象而不是原始指针数据(即使用std::vector
/std::array
/etc 代替new[]
和delete[]
,使用std::unique_ptr<T>
/std::shared_ptr<T>
代替T*
等。
【讨论】:
以上是关于哪个更优化:`new` 或 `calloc`? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
C ++中的“new”和“malloc”和“calloc”有啥区别? [复制]