2009-07-23 84 views
1

我只是想知道在C结构(C结构定义)中包装项目(int,float,union等)时要遵循的注意事项,以便编译器进一步优化它。最佳C结构定义

我想知道是否有任何指导方针应该遵循例如以允许与单词边界对齐的顺序将项目添加到结构。等等?

详情将不胜感激。

问候, -J

问题也需要向交叉的优化策略编译例如C结构。

回答

5

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

这里有一对夫妇约pahole的文章,可以帮助你:

+0

pahole似乎有趣的工具。但我不确定我是否使用gcc优化了我在linux上的结构定义,当我在Visual Studio环境中的Windows上编译它时,我该如何重新考虑它。 (我不是windows的家伙,所以它让我花更多时间来理解这个方面: - /) – 2009-07-24 17:18:00

+0

结构填充和对齐要求往往与硬件平台相关联,所以GCC的输出结构应该与VS的输出结构相同。 – Hasturkun 2009-07-24 20:38:17

+0

哦!我认为它的编译器是特定的,因为每个编译器都有自己的安排数据结构的方式。 (尽管每个编译器都试图按照硬件来优化)。因此,如果最初编译的代码在给定的平台上不是最优的,那么意味着交叉编译的代码将是最优的。对 ? – 2009-07-24 23:48:59

6

如果您确实想要最小化空间,请将事情从最大对齐排列到最小。这应该保证你会得到最小的填充。

+0

一个好的优化编译器应该可以为你做到这一点,但我不知道会有多少人会。我会假设GCC这样做,但我没有测试它。 – 2009-07-23 17:27:09

+10

C不允许编译器重新排列结构中的成员,所以如果你想要最小的空间和最高的效率,你必须自己做。 – nos 2009-07-23 17:31:40

+0

@chris,我希望它不会因为那肯定会被二进制blob映射破坏! – 2009-07-23 17:33:45

0

什么是你的程序的要求是什么?你会有多少元素?什么样的结构?例如,如果你有几个元素的结构体,并且你需要遍历这些元素的数组以搜索某些东西,那么最好不要使用数组的结构体,而是要做数组的结构体。这是因为经常使用的成员将并排定位,所以缓存内存将正常工作。

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

很难提供正确的建议,因为我不知道您对数据有什么期望。