c++ - 关于 null 与 null 对象性能的分支

标签 c++ dispatch branch-prediction null-object-pattern

哪个最有效:使用空对象,或 nullptr 上的分支。 C++ 中的示例:

void (*callback)() = [](){}; // Could be a class member

void doDoStuff()
    {
    // Some code
    callback();  // Always OK. Defaults to nop
    // More code
    }

对比

void (*callback)() = nullptr; // Could be a class member

void doDoStuff()
    {
    // Some code
    if(callback != nullptr)  // Check if we should do something or not
        {callback();}
    // More code
    }

null 对象将始终进行间接函数调用,假设编译器无法内联它。使用 nullptr,总是会做分支,如果有事情要做,它也会做一个间接的函数调用。

用指向抽象基类的指针替换回调会影响决策吗?

callback 设置为 nullptr 以外的东西的可能性如何。我想如果 callback 很可能是 nullptr,那么使用额外的分支会更快,对吧?

最佳答案

这些问题都无法先验地回答。它们将取决于无数因素,包括但不限于硬件的细节、调用时缓存的细节、围绕此类调用的各种代码(可能隐藏任何引入的延迟)、质量编译器的内联/去虚拟化能力(同样取决于所有代码的具体细节)等等。

只有当您拥有要优化的确切代码,并且某些知识所讨论的代码是一个值得进行此类优化的性能问题时,才应尝试进行此类微优化。

关于c++ - 关于 null 与 null 对象性能的分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58172247/

相关文章:

iOS-dispatcherTimer 阻止触摸事件?

Android NFC前台调度问题

c++ - 循环中分支预测的性能

c++ - 是否有一种(文学)算法可将每个传入边缘的节点拆分为一个节点?

c++ - 无法注册 hwnd 窗口

c++ - 在 C++ 中使用 Link Seam 打破静态变量依赖

arrays - Swift 逐个循环遍历数组,中间有停顿

c++ - 在没有分支的情况下比较字符是否相等

c - 使用 rdmsr/rdpmc 提高分支预测精度

c++ - Valgrind 和 "WARNING: new redirection conflicts with existing"