删除nullptr-性能开销

Deleting nullptr - performance overhead?

本文关键字:开销 性能 nullptr- 删除      更新时间:2023-10-16

运算符delete会检查指针是否为nullptr。在没有自己检查的情况下对nullptr调用delete是否有任何性能开销?

delete ptr;

if (ptr != nullptr) delete ptr; 

如果ptr是nullptr,上面哪一个执行得更快?

和往常一样,它取决于编译器。

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

规则规定,如果指针为null,则删除无效。因此,如果你不检查这一点,编译器无论如何都必须检查。

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

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

不,如果不检查ptr是否为nullptr,则不会产生任何开销。

如果手动进行检查,相同的检查会进行两次,尽管这是可以忽略的,但与系统调用的成本相比,如果ptr不为空,则可能会发生这种情况。

如果ptr是nullptr,上面哪一个执行得更快?

假设你的支票没有得到优化,那么最上面的支票会更快。如果它真的被优化掉了,两者都不会更快交给编译器处理