【问题标题】:Member hooks versus base hooks in intrusive data structures侵入式数据结构中的成员钩子与基本钩子
【发布时间】:2014-02-11 13:19:30
【问题描述】:

我正在编写一个侵入式数据结构并且想知道是使用基钩子还是成员钩子。由于代码将被多次调用,我的问题是关于性能以及编译器能够在多大程度上内联此类代码。

基本钩子基于继承,而成员钩子通过模板参数使用指向成员的指针。 我的设计选择是使用成员钩子,但我的经验表明,指针比静态代码更难优化。另一方面,所有这些指针在编译时都是已知的,也许编译器可以做一些魔术来分析正在发生的事情。

有人有这方面的经验吗?欢迎提供任何数据、提示或参考。

【问题讨论】:

  • 能否提供代码示例?
  • @ArmanHunanyan 你有什么样的例子? boost intrusive 有很好的描述。至于我自己的代码,放在这里会太大而且断章取义。
  • 注意:您忘记了另一种选择 => 一个属性 template <typename T> class IntrusiveListHook,该类应该公开公开,并且它本身不会公开任何内容(但它有一个 template <typename> friend class IntrusiveList

标签: c++ performance templates inlining intrusive-containers


【解决方案1】:

至于大多数“X vs Y,哪个更快?”问题只有一个正确答案:

询问您的分析员。

经验是模糊的。人类的猜测无法考虑编译器优化的所有细节和陷阱。编译器的不同之处在于他们可以优化什么以及他们做得有多好。有时甚至在同一编译器的不同版本之间。唯一可以告诉您您的实现如何在您的特定平台上由您的特定编译器优化的事情是对典型问题规模的性能进行适当的测量。

即使如果有人告诉你他知道什么更快,并给你一些漂亮的图表:你能足够信任他进行这些测量吗?他知道你的具体环境是什么样的吗?他和他的图表是否考虑到你的问题的特殊极端情况?很可能不是。

【讨论】:

  • 我会相信像 these 这样的测试,即使我不期望得到这样一个易于理解的答案,我完全不信任的数据仍然有用(例如,评估潜在收益是否值得麻烦)。
【解决方案2】:

由于数据和挂钩处于“有”关系,从设计的角度来看,我也更喜欢成员挂钩。我也不认为将钩子放在基类中与将它们直接放入类之间在优化方面没有区别。

Boost intrusive 中也对这些不同的方法进行了一些考虑。

【讨论】:

  • 在优化方面可能会有很大的不同,因为可能优化器无法看透继承层,可能使用了虚函数等。不知道优化器的能力和候选者,你无法判断手头的实现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-25
  • 2017-07-20
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 2020-02-20
  • 1970-01-01
相关资源
最近更新 更多