当前位置: 首页 > 知识库问答 >
问题:

在GCC中编译:O3有害吗?

后阳炎
2023-03-14

我听说不应该使用gcc的-O3选项进行编译。这是真的吗?如果是这样,避免-O3的原因是什么?

共有1个答案

阎烨
2023-03-14

答案是:这取决于您的代码。

基本经验法则是这样的:

>

  • 在 -O1 处,html" target="_blank">编译器执行的优化不会花费太长时间进行计算。

    在 -O2 中,编译器执行“昂贵”的优化,这可能会减慢编译过程。它们也可能使输出程序更大一些,但可能不会那么多。

    -Os与-O2大致相同,但是优化更多地针对大小而不是速度。在大多数情况下,这两个特性并不冲突(更优化的代码执行的步骤更少,因此也更小),但是有一些技巧可以复制代码以避免分支损失,例如。

    在-O3中,编译器真正启动了空间消耗优化。它将更积极地内联函数,并尽可能使用矢量化。

    您可以在GCC文档中阅读更多详细信息。如果您真的想超级优化您的代码,那么您可以尝试启用更多未使用的选项,即使在-O3;-floop-*选项,例如`。

    速度-空间优化的问题尤其在于,它们会对内存缓存的效率产生负面影响。代码可能对CPU更好,但是如果对你的内存不好,那么你就输了。由于这个原因,如果你的程序没有一个单独的热点,那么你可能会发现它整体变慢了。

    现实世界的优化是一门不精确的科学,原因有三:

    > < li>

    用户的硬件差异很大。

    对一个代码库有好处的东西可能对另一个代码库不好。

    我们希望编译器快速运行,因此它必须做出最佳猜测,而不是尝试所有选项并选择最佳选项。

    基本上,答案总是:如果性能很重要,尝试所有优化级别,衡量代码的性能,然后选择最适合您的。每次发生重大变化时,都要这样做。

    如果性能不重要,-O2是您的选择。

  •  类似资料:
    • 在我盲目地打开这些选项之前,我想知道我能期待什么。此外,由于-ofast打开了非标准兼容标志,我倾向于不使用它。我对-ofast很可能有“副作用”的假设是正确的吗? 在发布这个问题之前,我浏览了https://gcc.gnu.org/onlinedocs/gcc/optimize-options.html。

    • gcc 是 GNU 推出的功能强大、性能优越的多平台编译器,是 GNU 的代表作品之一。它能将C、C++语言源程序、汇编语言源程序和目标程序编译、链接成可执行文件,如果没有给出可执行文件的名字,gcc 将生成一个名为 a.out 的文件。 gcc 通过后缀来区分输入文件的类型: 后缀 类型 .c C语言源代码文件 .a 由目标文件构成的档案库文件 .C|.cc|.cxx C++源代码文件 .h 程

    • 我有一个使用Boost::move移动锁的函数- 我可以使用带有-std=c 11或-std=c 0x标志的gcc 4.7.3编译此代码。但是,使用gcc 4.6.4,即使使用-std=c 0x标志,此代码也会失败。关于如何修复此问题的任何想法? 用于使用C 11功能的CMAKE标志: 用于使用C 0x功能的CMAKE标志: 我在gcc 4.6.4中遇到的错误: 错误:不匹配~运算符!=™在~it

    • 在阅读了这篇漂亮的文章(预编译头的维护和输入)之后,我对这些在现实生活中如何实际工作产生了一些疑问。更具体地说,在以下场景中,我如何知道需要触发预编译头的重建: 我决定在我的一本书中定义一些东西。cpp文件,改变预处理器解释已包含在预编译头中的某些头的方式 预编译头的使用是否应该强制执行某种限制性的编码风格,比如将. cpp文件中包含的头的数量限制为一个,并且永远不要在. cpp文件中定义ing内

    • 前言 预处理 简述 打印出预处理之后的结果 在命令行定义宏 编译(翻译) 简述 语法检查 编译器优化 生成汇编语言文件 汇编 简述 生成目标代码 ELF 文件初次接触 ELF 文件的结构 三种不同类型 ELF 文件比较 ELF 主体:节区 汇编语言文件中的节区表述 链接 简述 可执行文件的段:节区重排 链接背后的故事 用 ld 完成链接过程 C++ 构造与析构:crtbegin.o 和 crten

    • 我是Android开发人员和计算机视觉工程师。 我正在Mac上用OpenCV做一个计算机视觉项目,用Xcode编写OS X10.9.5,它是跨平台的,所以我所做的是命令行编译到linux并访问它(服务器)。 我遇到的问题是无法识别库。我用: /home/ec2-user/project/utils.cpp:2475:未定义对`JSON::Value::Value(JSON::ValueType)'