优化各种C/ c++编译器的代码
Optimizing code for various C/C++ compilers
对于那些为多个平台开发软件的人,您如何处理编译器可能比其他编译器做得更好的可能性?
假设你在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
- 为什么所有C++编译器都会崩溃或挂起此代码
- 为C++03编译器编写部分unique_ptr,该编译器与较新的编译器在公共代码库上运行
- 与其他编译器相比,相同的代码在工作室Microsoft提供不同的输出
- Visual Studio 中是否有来自代码块的编译器标志的类似物?
- C++ 代码的行为因编译器而异
- 代码未在联机编译器上显示结果
- 在 Azure DevOps 构建管道中使用英特尔C++编译器为 Linux 环境构建C++代码
- 编译器资源管理器(godbolt)如何安全地运行代码?
- 使用特征C++需要哪个代码块编译器?
- GCC 编译器是否应该对涉及 [[fallthrough]] 属性的格式错误的C++代码进行诊断?
- boost::spirit--试图编译大多数简单代码的编译器错误
- 使用其他编译器编译QT代码
- 使用 Mac 终端编译器编译 c++14 代码
- 我最近更改了编译器路径以运行 c++ 代码,但现在我无法运行任何 python 代码。我该如何解决这个问题?
- 编译器是否C++具有相同模板参数集的每个模板类实例生成代码?
- 为什么当我的代码超出函数范围时,"does not name a type"出现编译器错误?
- 如何获得代码::块的C++代码编译器?
- 编译器会自动优化重复代码吗?
- 数字火星编译器(代码::块)无法打开文件'iostream'
- 端口/重新编码真正大和旧的C++编译器代码到Qt或CLI/Mono