优化各种C / C ++编译器的代码

时间:2013-03-21 21:27:28

标签: c++ compiler-construction c-preprocessor development-environment compiler-optimization

对于那些为多个平台开发软件的人来说,如何处理编译器可能比其他编译器更好地做某些事情的潜力。

假设您为OS X,Windows,Linux开发,并且您正在使用Clang / LLVM,VS和GCC。

因此,如果有人在OS X上编译您的应用程序并且他们正在使用GCC而另一个人使用英特尔编译器在OS X上编译,并且您可以优化英特尔编译器的代码部分有他们。

您是否只需检查预处理程序指令?

#ifdef __GCC_
    // do it this way
#endif

#ifdef __INTEL__
    // do it this way
#endif

#ifdef __GCC_WITH C++_V11_Support__
    // do it this way
#endif

#idfef __WINDOWS_VISUAL_STUDIO
    // do it this way
#endif

还是有更好的方法吗?

如何找到编译器为检查编译器版本等提供的指令列表

3 个答案:

答案 0 :(得分:6)

不要选择基于预定义宏的实现。让构建系统控制它。

这使您可以在单元测试期间构建和比较多个实现。

答案 1 :(得分:3)

通常,优化遵循传统的80/20或90/10规则“20%的代码需要80%的时间才能运行”(并且“20%的代码需要80%的时间来开发” )。如果你愿意的话,用90/20代替90/20 - 它几乎总是在这两者之间......

因此,“我们是否针对特定编译器进行优化”的第一个阶段是弄清楚代码的哪些部分很慢,以及是否可以通过适用于所有编译器的通用方式使其更好(例如,传递const引用而不是大对象的副本)。一旦你用尽了对代码的所有通用改进,你可能想要看一下编译器特定的优化 - 但这确实要求你获得足够的收益,以确保在不同编译器之间使用不同代码的额外维护是值得的。

一般来说,我会非常避免“不同编译器中的内容不同”。

答案 2 :(得分:0)

一般来说,编译器是为了优化公共代码而编写的,而不是专门为编译器编写的专用代码。因此,通常您应该专注于使用最快的算法编写干净的代码。但是有些编译器是可以使用的,例如gcc,通过使用这些属性的属性可以让编译器更好地完成它的工作。

例如,使用noreturn属性将允许gcc丢弃函数返回码,从而最小化代码大小。我想很多编译器都有类似的提示方案。

然后就可以做;

#ifdef GCC
     #define NO_RETURN __attribute(...)
#else
     #define NO_RETURN
#endif

在代码中使用NO_RETURN。