【问题标题】:Best way to access nested data structures?访问嵌套数据结构的最佳方式?
【发布时间】:2010-06-03 19:17:04
【问题描述】:

我想知道访问大型数据结构的最佳方式(性能方面)是什么。 有大约一百种方法可以做到这一点,但编译器最容易优化的方法是什么?

人们可以通过

foo[someindex].bar[indexlist[i].subelement[j]].baz[0]

或创建一些指针别名,如

sometype_t* tmpfoo = &foo[someindex];
tmpfoo->bar[indexlist[i].subelement[j]].baz[0]

或创建参考别名,如

sometype_t &tmpfoo = foo[someindex];
tmpfoo.bar[indexlist[i].subelement[j]].baz[0]

等等……

【问题讨论】:

  • 当你测量差异时,你发现了什么?
  • 第一个选项是最慢的,可能是由于访问操作员呼叫很多。第二个是这 3 个中最好的。
  • 请更新您的问题以表明您已经知道答案并且这是第二个选项。那么,请关闭问题,因为您已经知道答案并且不需要我们提供任何东西。

标签: c++ performance nested


【解决方案1】:

过早的优化是万恶之源。编写清晰的代码,如果太慢,请分析它并查看时间花在哪里并在那里优化。

话虽如此,编译器为所有这三个示例生成相同代码的可能性为 99%。

【讨论】:

    【解决方案2】:

    您在此处描述的所有三个都将编译(使用体面的编译器)成相同的东西。

    【讨论】:

      【解决方案3】:

      作为个人喜好,如果要遍历的嵌套级别更少,我通常会更容易阅读和理解。因此,我倾向于使用 ...

      SomeType  *pSomeType = &asManyLevelsAsItMakesSense[someIndex];
      pSomeType->subSomeNestedLevels = ...;
      

      我发现这在处理循环中的深层嵌套结构时特别有用。识别不变的嵌套部分并将其提升到循环之外。

      SomeType  *pSomeType = &...;
      for (i = 0; i < N; i++)
          pSomeType->field[i] = ...;
      

      与往常一样,了解您的编译器及其实际生成的内容是值得的。有时您可能会为您的项目使用一个根本没有优化的编译器,这样的小事情可能会有所作为(但不要假设它会)。

      【讨论】:

        猜你喜欢
        • 2018-05-05
        • 2023-03-17
        • 2011-09-21
        • 2020-01-19
        • 2017-02-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多