【问题标题】:Deleting nullptr - performance overhead?删除 nullptr - 性能开销?
【发布时间】:2012-03-16 17:06:44
【问题描述】:

如果指针为 nullptr,运算符 delete 会检查自身。在 nullptr 上调用 delete 而不自己检查是否有任何性能开销?

delete ptr;

if (ptr != nullptr) delete ptr; 

如果 ptr 为 nullptr,以上哪个执行得更快?

【问题讨论】:

  • 后者是多余的,所以抛开潜在的速度差异,情况更糟。

标签: c++


【解决方案1】:

像往常一样,这取决于编译器。

我使用 MSVC,它将这两行编译成完全相同的代码。

规则说如果指针为空,则删除无效。所以如果你不检查,编译器无论如何都要检查。

【讨论】:

    【解决方案2】:

    这绝对是过度优化的情况。在任何现代处理器上,差异只有几纳秒。

    通过进行检查,代码避免了调用(对删除库例程)的开销。在 99% 的情况下,源代码的轻微额外复杂性(大括号、潜在的拼写错误 != 等)比额外的执行时间更成问题。

    【讨论】:

    • 检查必须在生成的代码中,在调用库::operator delete()之前,因为如果指针是null,编译器也不允许调用析构函数。
    【解决方案3】:

    不,当您不检查 ptr 是否为 nullptr 时,没有任何开销。

    如果您手动进行检查,则相同的检查会进行两次,虽然这可以忽略不计,但与系统调用的成本相比,您可以预期 ptr 是否不为空。

    【讨论】:

    • 另外,如果你已经在使用 C++11,也许考虑不使用 delete 而是使用智能指针?
    • C++11 不是必需的——Boost 多年来一直拥有良好的智能指针。 :-]
    • 当然!但是当它们就在你的手下时,你没有更多的借口在大多数标准情况下不使用它们:)
    【解决方案4】:

    如果 ptr 为 nullptr,以上哪个执行得更快?

    假设您的检查没有得到优化,那么顶部的检查会更快。如果它确实得到优化,那么两者都不会更快。 把它留给编译器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-19
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-09
      • 2018-07-26
      • 1970-01-01
      相关资源
      最近更新 更多