删除nullptr-性能开销
Deleting nullptr - performance overhead?
运算符delete会检查指针是否为nullptr。在没有自己检查的情况下对nullptr调用delete是否有任何性能开销?
delete ptr;
或
if (ptr != nullptr) delete ptr;
如果ptr是nullptr,上面哪一个执行得更快?
和往常一样,它取决于编译器。
我使用MSVC,它将这两行代码编译成完全相同的代码。
规则规定,如果指针为null,则删除无效。因此,如果你不检查这一点,编译器无论如何都必须检查。
这绝对是过度优化的情况。在任何现代处理器上,差异都只有几纳秒。
通过进行检查,代码避免了调用(删除库例程)的开销。在99%的情况下,源代码的轻微额外复杂性(大括号、潜在的!=
拼写错误等)比额外的执行时间更成问题。
不,如果不检查ptr
是否为nullptr
,则不会产生任何开销。
如果手动进行检查,相同的检查会进行两次,尽管这是可以忽略的,但与系统调用的成本相比,如果ptr
不为空,则可能会发生这种情况。
如果ptr是nullptr,上面哪一个执行得更快?
假设你的支票没有得到优化,那么最上面的支票会更快。如果它真的被优化掉了,两者都不会更快交给编译器处理
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- OpenMP阵列性能较差
- 实现无开销push_back的最佳方法是什么
- 递归列出所有目录中的C++与Python与Ruby的性能
- 大小相等但成员数量不同的结构之间的性能差异
- 为什么constexpr的性能比正常表达式差
- 在类中使用随机生成器时出现性能问题
- 在main()之外初始化std::vector会导致性能下降(多线程)
- C++ 特征库:引用的性能开销<>
- 与纯 V8 相比,NodeJS 是否有任何性能缺陷或显著开销?
- 虚拟继承的性能开销(如果只有一个基具有数据成员)
- 并发::并行端口开销和性能命中率(经验法则)
- Getters和Setters.是否存在性能开销
- 重载运算符 [] 从 1 开始,并产生性能开销
- 如何在测量性能时减少循环的开销
- 通过 iStringStream 标记化的 C++ 字符串的性能开销
- 可以通过减少多线程中系统调用(互斥/信号量)的开销来真正提高性能::atomic
- 测试操作系统性能时,硬件开销和软件开销有什么区别
- 删除nullptr-性能开销
- 以多态的方式处理非多态对象,不会产生性能开销