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

Optimizing code for various C/C++ compilers

本文关键字:编译器 代码 c++ 优化      更新时间:2023-10-16

对于那些为多个平台开发软件的人,您如何处理编译器可能比其他编译器做得更好的可能性?

假设你在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

还是有更好的方法?

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

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

这允许您在单元测试期间构建和比较多个实现。

通常,优化遵循传统的80/20或90/10规则,即"20%的代码需要80%的时间来运行"(以及"20%的代码需要80%的时间来开发")。如果你愿意,可以用80/20代替90/10——几乎总是介于这两者之间。

所以,"我们是否为一个特定的编译器优化"的第一步是找出你的代码的哪些部分是缓慢的,以及你是否可以用一种通用的方式使它在所有编译器上都能工作(例如传递const引用而不是一个大对象的副本)。一旦您完成了对代码的所有通用改进,您可能想要查看特定于编译器的优化—但这确实需要您获得足够的收益,以便在不同的编译器之间维护不同的代码。

一般来说,我会尽量避免"不同的编译器有不同的东西"。

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

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

可以这样做;

#ifdef GCC
     #define NO_RETURN __attribute(...)
#else
     #define NO_RETURN
#endif
在你的代码中使用NO_RETURN