【问题标题】:Which is more optimal: `new` or `calloc`? [duplicate]哪个更优化:`new` 或 `calloc`? [复制]
【发布时间】: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 不是。到目前为止,没有太多理由说明哪个更优化,因为其中只有一个是正确的

标签: c++ windows memory-management heap-memory


【解决方案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* 等。

        【讨论】:

          猜你喜欢
          • 2011-10-09
          • 1970-01-01
          • 2011-06-01
          • 1970-01-01
          • 2012-09-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-10-23
          相关资源
          最近更新 更多