RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 833456
Accepted
Semerkin
Semerkin
Asked:2020-05-25 23:50:49 +0000 UTC2020-05-25 23:50:49 +0000 UTC 2020-05-25 23:50:49 +0000 UTC

g++/gcc 编译器优化选项

  • 772
  1. 在讨论优化的背景下展开循环意味着什么(如果可能以工农方式)
  2. 在某些选项中,没有嵌入函数......但是没有嵌入怎么办?(在嵌入下,我了解可执行文件中存在功能代码)
  3. 我可以编译具有不同优化的单个模块,然后将它们单击到可执行文件中吗?
оптимизация
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    insolor
    2020-05-26T00:17:17Z2020-05-26T00:17:17Z
    1. 循环展开是将循环代码转换为非循环代码。例如,这段代码:

      for(i=0; i<5; i++) func(i);
      

      展开于

      func(0);
      func(1);
      func(2);
      func(3);
      func(4);
      

      当在编译时知道循环迭代的次数时,循环展开就起作用了。会增加本机代码的大小,但可能会提高性能。由于没有跳转,性能可以提高(简单地说,处理器更容易执行线性代码,加上编译器可以通过特殊方式对指令进行分组/重新排列来进一步优化线性代码)。

    2. 嵌入(“内联”),如果完全简化的话,就是用函数体代替(而不是)它的调用。如果从多个位置调用该函数,这将增加本机代码的大小,但可能会提高性能,例如,如果在循环内调用该函数。根据优化级别,编译器可能会内联未标记为inline. 或者不要使用该关键字内联函数。

    3. 你可以。正如您在问题中所写的那样 - 分别编译每个模块,然后将生成的目标文件链接到可执行文件中。我看不出有多少实际用途。

    4. 在选择优化参数之前,是否应该首先评估代码的循环和内联函数?

      优化可以使事情变得更好,也可以破坏事情,特别是如果您的代码中有部分行为未定义。此外,在高度优化时,可能会使用特定于您的处理器的机器指令,因此,可执行文件可能无法在某些计算机上运行。因此 - 尝试在不同的优化级别进行编译,并在不同的计算机上进行测试。专门为某些编译器的功能锐化您的代码,或者为了进行某种优化,恕我直言,是不值得的。最好做高级优化(算法优化),低级编译器会为你做。

    • 4
  2. Fat-Zer
    2020-05-26T00:27:13Z2020-05-26T00:27:13Z

    在讨论优化的背景下(如果可能,以工农方式)展开循环意味着什么。

    假设有三个向量和一个循环:

    int a[3], b[3] , c[3];
    // ...
    for (int i =0; i<3; ++i) {
      c[i] = a[i] +b[i];
    }
    

    循环展开意味着编译器可以用汇编代码替换这个循环,类似于从以下生成的代码:

    c[0] = a[0] + b[0];
    c[1] = a[1] + b[1];
    c[2] = a[2] + b[2];
    

    在某些选项中,没有嵌入函数......但是没有嵌入怎么办?(在嵌入下,我了解可执行文件中存在功能代码)

    错了,函数内联是关键字暗示的inline。那些。什么时候:

    inline int add (int a, int b) { return a+b;}
    
    int main (void) {
      int aMain,bMain;
      // ... 
      int c = add (aMain, bMain);
    }
    

    身体可以在它调用的地方被替换。那些。实际上,代码可能类似于以下内容:

    int main (void) {
      int aMain,bMain;
      // ... 
      int c = aMain + bMain;
    }
    

    重要的一点:内联的决定总是由编译器做出的,内联只是“建议”它并调整它的启发式。

    我可以编译具有不同优化的单个模块,然后将它们单击到可执行文件中吗?

    一般来说 - 是的,至少对于这个标志不-O[123s]应该产生问题。但是恕我直言,您可以选择一些会导致冲突或错误的标志组合(例如,各种标志-fabi-version=*)。

    • 3

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5