繁体   English   中英

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

[英]Optimizing code for various C/C++ compilers

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

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

因此,如果有人编译你的OS X应用程序,他们正在使用GCC和另一个人编译使用英特尔编译器OS X,你可以优化的代码段用于英特尔编译器如果这个人有他们。

您是否只检查Preprocessor指令?

#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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM