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

问题描述 投票:0回答:3

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

假设您为 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

或者有更好的方法吗?

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

c++ c-preprocessor compiler-optimization development-environment
3个回答
6
投票

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

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


3
投票

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

因此,“我们是否针对特定编译器进行优化”的第一阶段是找出代码的哪些部分速度较慢,以及是否可以通过适用于所有编译器的通用方式使其变得更好(例如传递 const 引用)而不是大对象的副本)。一旦您用尽了对代码的所有通用改进,您可能需要查看特定于编译器的优化 - 但这确实需要您获得足够的知识,以便在不同编译器之间拥有不同的代码确实值得进行额外的维护。

一般来说,我会非常避免“不同编译器中的情况有所不同”。


0
投票

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

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

然后就可以做到;

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

并在代码中使用 NO_RETURN。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.