【发布时间】:2012-03-16 17:06:44
【问题描述】:
如果指针为 nullptr,运算符 delete 会检查自身。在 nullptr 上调用 delete 而不自己检查是否有任何性能开销?
delete ptr;
或
if (ptr != nullptr) delete ptr;
如果 ptr 为 nullptr,以上哪个执行得更快?
【问题讨论】:
-
后者是多余的,所以抛开潜在的速度差异,情况更糟。
标签: c++
如果指针为 nullptr,运算符 delete 会检查自身。在 nullptr 上调用 delete 而不自己检查是否有任何性能开销?
delete ptr;
或
if (ptr != nullptr) delete ptr;
如果 ptr 为 nullptr,以上哪个执行得更快?
【问题讨论】:
标签: c++
像往常一样,这取决于编译器。
我使用 MSVC,它将这两行编译成完全相同的代码。
规则说如果指针为空,则删除无效。所以如果你不检查,编译器无论如何都要检查。
【讨论】:
这绝对是过度优化的情况。在任何现代处理器上,差异只有几纳秒。
通过进行检查,代码避免了调用(对删除库例程)的开销。在 99% 的情况下,源代码的轻微额外复杂性(大括号、潜在的拼写错误 != 等)比额外的执行时间更成问题。
【讨论】:
::operator delete()之前,因为如果指针是null,编译器也不允许调用析构函数。
不,当您不检查 ptr 是否为 nullptr 时,没有任何开销。
如果您手动进行检查,则相同的检查会进行两次,虽然这可以忽略不计,但与系统调用的成本相比,您可以预期 ptr 是否不为空。
【讨论】:
如果 ptr 为 nullptr,以上哪个执行得更快?
假设您的检查没有得到优化,那么顶部的检查会更快。如果它确实得到优化,那么两者都不会更快。 把它留给编译器。
【讨论】: