【问题标题】:Optimal C Structure definition最优 C 结构定义
【发布时间】:2009-07-23 17:19:08
【问题描述】:

我只是想知道在将项目(int、float、union 等)打包到 C 结构(C 结构定义)中时要遵循的注意事项,这将允许编译器进一步优化它。

我想知道是否有任何应该遵循的准则,例如以允许对齐单词边界的顺序将项目添加到结构中。 ETC。 ?

我们将不胜感激。

问候, -J

该问题还涉及交叉编译此类 C 结构的优化策略。

【问题讨论】:

    标签: c optimization compiler-construction structure definition


    【解决方案1】:

    如果您真的想最小化空间,请从最大对齐到最小对齐。这应该保证您将获得最小的填充。

    【讨论】:

    • 一个好的优化编译器应该可以为你做到这一点,但我不知道有多少会。我会假设 GCC 会这样做,但我还没有测试过。
    • C 不允许编译器重新排列结构中的成员,所以如果你想要最小的空间和最大的效率,你必须自己做。
    • @chris,我希望它不会,因为这肯定会被二进制 blob 映射破坏!
    • 据我所知,编译器不会重新组织数据,因为它会影响映射(正如 Aiden 所说)。它会影响 SIMD 操作的对齐,也可能会导致使用内存指针访问时出现一些问题。
    • 确实如此。我理解为什么您可能不想重新排列成员,但依赖结构的确切内存映射似乎是个坏主意。
    【解决方案2】:

    如果你可以在 gcc 下编译你的代码,你也许可以使用pahole 找到可以改进的结构,并自动重新打包它们。

    这里有几篇关于 pahole 的文章可能会对您有所帮助:

    【讨论】:

    • pahole 似乎是个有趣的工具。但我不确定我是否使用 gcc 在 linux 上优化我的结构定义,当我在 Visual Studio 环境中的 Windows 上编译它时,我该如何重新考虑它。 (我不是 Windows 人,所以我需要更多时间来了解这方面:-/)
    • 结构填充和对齐要求往往与硬件平台相关,因此 GCC 的输出结构应该与 VS 输出的结构相同。
    • 哦!我认为它的编译器是特定的,因为每个编译器都有自己的数据结构排列方式。 (尽管每个编译器都试图根据硬件对其进行优化)。因此,如果最初编译的代码在给定平台上是最优的,则不一定意味着交叉编译的代码是最优的..?对吗?
    【解决方案3】:

    您的计划有什么要求?你会有多少元素?什么样的结构?

    例如,如果你有多个元素的结构,并且你需要遍历这些元素的数组来搜索东西,那么最好不要使用结构数组,而是使用数组结构。那是因为经常使用的成员会并排放置,所以缓存内存可以正常工作。

    如果您想利用 SIMD(向量)操作,您应该将所有成员对齐一些边界。

    很难给出正确的建议,因为我不知道你对你的数据有什么期望。

    【讨论】:

      猜你喜欢
      • 2013-05-31
      • 2014-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-12
      • 2015-05-23
      • 2018-06-19
      • 1970-01-01
      相关资源
      最近更新 更多