对于那些为多个平台开发软件的人,如何处理编译器可能比其他编译器做得更好的潜力。
假设您是为OS、Windows、Linux开发的,您使用的是Clang/LLVM、VS和GCC。
所以,如果有人在OS上编译你的应用程序,他们使用GCC,而另一个人用Intel编译器在OS上编译,你可以为英特尔编译器优化代码的各个部分,如果这个人有它们的话。
你能检查一下预处理指令吗?
#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还是有更好的方法?
如何找到编译器为检查编译器版本提供的指令列表等?
发布于 2013-03-21 21:36:09
不要选择基于预定义宏的实现。让构建系统来控制它。
这使您可以在单元测试期间构建和比较多个实现。
发布于 2013-03-21 21:35:45
通常,优化遵循传统的80/20或90/10规则,即"20%的代码占用80%的运行时间“(而"20%的代码需要80%的开发时间”)。如果你愿意的话,用80/20代替90/10 --几乎总是介于这两者之间.
因此,“为特定编译器优化”的第一步是确定代码的哪些部分比较慢,以及是否可以以通用的方式使代码更好地工作在所有编译器上(例如,传递const引用而不是大对象的副本)。一旦您已经用尽了对代码的所有通用改进,您可能想要查看编译器特定的优化--但这确实要求您获得足够多的信息,因此真正值得对不同编译器之间的代码进行额外的维护。
一般来说,我会非常避免“不同的编译器有不同的情况”。
发布于 2013-03-21 21:33:22
一般来说,编写编译器是为了优化通用代码,而不是专门为编译器编写的特定代码。因此,通常您应该只关注编写干净的代码,使用最快的算法。然而,有些编译器是不允许的,例如gcc,通过使用这些属性可以让编译器更好地完成它的工作。
例如,使用instance属性将允许gcc丢弃函数返回代码,从而最小化代码大小。我想很多编译器都有类似的暗示方案。
这样,我们就可以做到;
#ifdef GCC
#define NO_RETURN __attribute(...)
#else
#define NO_RETURN
#endif并在代码中使用NO_RETURN。
https://stackoverflow.com/questions/15558488
复制相似问题