C++ pimpl 与纯虚拟接口性能
C++ Pimpl vs Pure Virtual Interface Performance
我知道有很多关于这个主题的帖子,但我很难找到这个确切问题的答案。
对于函数调用,纯虚拟接口和 pimpl 哪个更快?
乍一看,在我看来,纯虚拟接口会更快,因为使用 pimpl 将花费两个函数调用而不是一个......或者在这种情况下,某种聪明的编译器技巧会接管吗?
编辑:我正在尝试决定应该使用其中的哪一个来抽象出一些对象的系统依赖部分,这些对象最终可能不得不非常频繁地大量生成。
编辑:
我想在这一点上值得一提的是,我问题的根源是我误认为抽象工厂设计模式是一种使我的代码在多个平台上工作的方法,而它的真正目的是在运行时切换给定接口的实现。
这两个选项并不等同,由于重点不同,因此不应在性能上进行比较。即使它们是等效的,在大多数情况下,性能差异也是很小的或不重要的。如果您在极少数情况下知道调度是一个问题,那么您就有工具可以自己衡量差异。
你为什么这么问?这个问题似乎没有意义。
当人们想要多态性时,人们通常使用虚函数:当你希望在派生类中覆盖它们时。
当想要从头文件中删除实现细节时,通常使用 pimpl。
这两者真的不能互换。在我的头顶上,我想不出任何合理的情况,你会使用一个并考虑用另一个替换它。
无论如何,也就是说,对于虚函数的典型实现,函数调用涉及读取对象以查找虚函数表指针,
然后读取虚函数表以查找函数指针,最后调用函数指针。
对于通过 pimpl 实现的类,一个函数调用是强制的,但它绝对可以是"幕后"的任何内容。不管你有什么建议,范式都没有暗示第二个函数调用。
最后,不要忘记通常的优化准则:您必须实际实施和衡量。试图"思考"答案往往会导致糟糕的结果,即使是在这种事情上有经验的人。
当然,最重要的优化规则是:在花费大量时间尝试优化之前,确保某些事情很重要。否则,您最终会浪费大量时间和精力。
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- OpenMP阵列性能较差
- 递归列出所有目录中的C++与Python与Ruby的性能
- 大小相等但成员数量不同的结构之间的性能差异
- 为什么constexpr的性能比正常表达式差
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- Visual C++GC接口如何启用它以及要包含哪个库
- Windows.h与GLFW.h的接口
- 在类中使用随机生成器时出现性能问题
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 提供与TMP和SFINAE的通用接口
- 为重写std::exception的库生成swig接口时出错
- 内联如何影响模块接口中的成员函数
- COM 接口 c# 封送数组数组
- 如何在 SCIP C++ 接口中获取 MILP 约束矩阵中的系数值
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- 海湾合作委员会 ARM 性能下降
- 共享内存系统性能的消息传递接口
- C++ pimpl 与纯虚拟接口性能