当我一步编译所有内容时,GCC 可以更好地优化事情吗?

2024-01-04

当我传递它时,gcc 会优化代码-O2标志,但我想知道如果我将所有源文件编译为目标文件,然后再链接它们,它实际上可以做到多好。

这是一个例子:

// in a.h
int foo(int n);

// in foo.cpp
int foo(int n) {
  return n;
}

// in main.cpp
#include "a.h"
int main(void) {
  return foo(5);
}

// code used to compile it all
gcc -c -O2 foo.cpp -o foo.o
gcc -c -O2 main.cpp -o main.o
gcc -O2 foo.o main.o -o executable

通常,gcc 应该内联foo因为它是一个小函数并且-O2使-finline-small-functions, 正确的?但在这里,gcc 只能看到以下代码foo and main在创建目标文件之前独立进行,因此不会有任何类似的优化,对吗?那么,这样的编译真的会让代码变慢吗?

不过,我也可以这样编译:

gcc -O2 foo.cpp main.cpp -o executable

这样会更快吗?如果不是的话,这样会更快吗?

// in foo.cpp
int foo(int n) {
  return n;
}

// in main.cpp
#include "foo.cpp"
int main(void) {
  return foo(5);
}

Edit: 我在看objdump,其反汇编代码表明只有#include "foo.cpp"事情成功了。


看来您自己重新发现了有关C和C++使用的单独编译模型的问题。虽然它确实减轻了内存需求(这在其创建时很重要),但它通过仅向编译器公开最少的信息来实现这一点,这意味着无法执行某些优化(如本例)。

较新的语言及其模块系统可以公开尽可能多的必要信息,如果模块进入下一版本的 C++,我们希望能够发挥这些优势......

同时,最简单的事情就是链接时优化。这个想法是,您将对每个 TU(翻译单元)执行尽可能多的优化以获得目标文件,但您还将使用 IR(中间表示,编译器使用它来优化)丰富传统的目标文件(包含程序集) ) 部分或全部功能。

当调用链接器将这些目标文件合并在一起时,它不只是将文件合并在一起,而是合并 IR 表示,重新执行许多优化过程(不断传播、内联……),然后在其上创建程序集自己的。这意味着它实际上不仅仅是一个链接器,而是一个后端优化器。

当然,像所有优化过程一样,这也是有代价的,因此会导致编译时间更长。另外,这意味着编译器and应该向链接器传递一个特殊选项来触发此行为,在 gcc 的情况下,它将是-lto or -O4.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当我一步编译所有内容时,GCC 可以更好地优化事情吗? 的相关文章

  • 获取当前用户的 NetworkCredential (C#)

    我正在尝试从控制台应用程序调用 Web 服务 并且我需要向客户端提供System Net NetworkCredential object 是否有可能创建一个NetworkCredential启动应用程序的用户的对象而不提示输入用户名 密码
  • 在子目录中构建共享库

    我正在尝试构建一个使用一些 C 代码的 R 包 我有一个编译为可执行文件的 C 库 可以从命令行调用 有一个与之关联的 Makefile 我正在尝试获取信息here http cran r project org doc manuals R
  • 使用索引避免迭代器失效,维护干净的接口

    我创建了一个MemoryManager
  • 在异步方法中使用时 HttpClient 标头被清空

    我正在使用 NET Framework 4 6 1 我的 Web api 中有一个控制器 其中有静态 HttpClient 来处理所有 http 请求 在 IIS 上托管我的应用程序后 大约每月一次 我的应用程序的所有传入请求都会出现以下异
  • 错误 C2065:'cout':未声明的标识符

    我正在处理我的编程作业的 驱动程序 部分 但我不断收到这个荒谬的错误 错误 C2065 cout 未声明的标识符 我什至尝试过使用std cout但我收到另一个错误 IntelliSense 命名空间 std 没有成员 cout 当我宣布u
  • VS2010中VSHost.exe不断启动

    我正在 VS2010 中使用一个包含大量项目的解决方案 但它不断变得无响应 我注意到的一件事可能是一条线索 尽管我尚未开始任何调试 但 MyApplicationName vshost exe 不断出现在进程列表中 也许每当构建发生时它就会
  • MVVM 同步集合

    是否有一种标准化方法可以将 Model 对象集合与 C 和 WPF 中匹配的 ModelView 对象集合同步 我正在寻找某种类 可以使以下两个集合保持同步 假设我只有几个苹果 并且可以将它们全部保存在内存中 换句话说 我想确保如果我将 A
  • 如何在 WCF 中反序列化自定义 SOAP 标头?

    我正在尝试向通过 WCF 的所有 SOAP 请求添加自定义标头 我发现这篇精彩的文章 http blogs msdn com b mohamedg archive 2012 10 21 adding custom soap headers
  • 解析通过asp:FileUpload上传的XML文件

    我有一个场景 用户将上传 XML 文件 我想将该文件添加到数据库中的表中 不过 困难的部分是我需要解析文件 然后将一些信息添加到一些不同的表中 显示如何获取 XML 文件的每个示例都使用 URI 来获取文件 但是如何直接从数据库获取文件 或
  • argc 和 argv 在 Windows 中没有用吗?

    在 Linux 中 argc 和 argv 计算终端中的参数 但在 Windows 中 我找不到放置第二个参数的地方 事实上 每次我运行该程序时 它都会创建那个丑陋的黑色窗口 我什至没有机会给出任何争论 那么这两个变量在Windows平台下
  • 如何获取错误字符串格式的警告 (C++)

    如果我使用不好的术语 请提前道歉 当我在 gdb 下编译 C 应用程序并使用 printf 时 它会给出有关格式字符串和传入参数的一致性的令人敬畏的警告 例如 这段代码 printf s s foo 导致编译器警告 格式参数太少 这是超级有
  • 链接错误:xxx 已在 *****.LIB 中定义:: 究竟出了什么问题?

    Problem 我正在尝试使用一个名为DCMTK http dicom offis de dcmtk它使用了一些其他外部库 zlib libtiff libpng libxml2 libiconv 我已经从同一网站下载了这些外部库 LIB
  • 如何通过 Excel 互操作对象自动调整列大小?

    下面是我用来将数据加载到 Excel 工作表中的代码 但我希望在加载数据后自动调整列的大小 有谁知道自动调整列大小的最佳方法 using Microsoft Office Interop public class ExportReport
  • Subsonic 3 ActiveRecord 嵌套选择导致 NotIn 错误?

    我有以下 Subsonic 3 0 查询 其中包含嵌套的 NotIn 查询 public List
  • 如何进行平衡组捕获?

    假设我有这个文本输入 tes tR R abc aD mnoR xyz 我想提取 ff 输出 R abc R xyz D mnoR xyz R R abc aD mnoR xyz 目前 我只能使用平衡组方法提取组内的内容 如中所示msdn
  • 在 C# 中为 ListBox 分配数据源时,如何从 ListBox 中删除所选项目?

    在 C 中为 ListBox 分配数据源时 如何从 ListBox 中删除所选项目 尝试删除时出现错误 设置 DataSource 属性后 无法修改项目集合 但是当我尝试从数据源 数据表 中删除项目时 它会抛出错误 因为 数据行不在当前行集
  • 矩阵行列式算法 C++

    我是编程新手 我一直在寻找一种找到矩阵行列式的方法 我在网上找到了这段代码 但我很难理解这里的算法 我对递归的基础没有问题 但继续和主循环我很难理解 非常感谢任何可以向我解释该算法的人 int determ int a MAX MAX in
  • 如何以一对一/零关系更新员工和身份用户

    我正在尝试更新员工记录 也想更新身份用户 如果我先单独更新身份用户 例如 UserManager Update user Context Entry employee State System Data Entity EntityState
  • Unity 错误“内部构建系统错误。后端退出,代码为 -1073740791。”摧毁/杀死了我的项目

    好吧 我可能在这里夸大了 但这是真的 当我开始打开它时 该项目由于错误 内部构建系统错误 后端退出 代码为 1073740791 而被破坏 应用程序 这个项目已经在Google Play上发布了 也许和设置有关 有人可以帮忙吗 完整错误 I
  • Json.net 将数字属性序列化为字符串

    我正在使用 JsonConvert SerializeObject 序列化模型对象 服务器期望所有字段都是字符串 我的模型对象具有数字属性和字符串属性 我无法向模型对象添加属性 有没有办法将所有属性值序列化为字符串 我必须只支持序列化 而不

随机推荐

  • strtok调用时出现问题

    我有一个像这样使用 strtok 的函数 void f1 char name char tmp tmp strtok names while tmp tmp strtok NULL 我有一个电话 f1 abc def 问题是在第一次调用中
  • 无法实例化名为 ADBannerView 的类

    我试图在我的应用程序底部插入 iad 横幅 但在遵循教程后不断出现错误 代码如下 interface DMKHomeViewController UIViewcontroller
  • 手动创建 pyspark 数据框

    我正在尝试根据某些数据手动创建 pyspark 数据框 row in 1566429545575348 40 353977 111 701859 rdd sc parallelize row in schema StructType Str
  • 模板引擎实现

    我目前正在构建这个小型模板引擎 它需要一个参数中包含模板的字符串 以及一个 标签 值 的字典来填充模板 在引擎中 我不知道模板中将包含哪些标签 哪些不会 我目前正在字典上迭代 foreach 解析我放入字符串生成器中的字符串 并将模板中的标
  • 如何使用 Swift 创建属性字符串?

    我正在尝试制作一个简单的咖啡计算器 我需要以克为单位显示咖啡的量 克的 g 符号需要附加到我用来显示数量的 UILabel 上 UILabel 中的数字会随着用户输入而动态变化 但我需要在字符串末尾添加一个小写 g 其格式与更新数字不同 g
  • JPA 查询/Hibernate:列必须出现在 GROUP BY 子句中或在聚合函数中使用

    我有下表session sessionid user id begin timestamp 1 A 1234 2 B 4567 3 A 8912 4 C 3456 该表提供有关用户会话的信息 基本上 会话是指用户成功登录 现在 我想获取最近
  • 数字和日期格式:更改 NLS_SESSION_PARAMETERS 不起作用?

    Oracle 11 2 0 3 0 APEX 4 1 1 00 23 我们需要显示numbers在我们的应用程序中 格式为FM999999999990 000 and dates与英文格式DD MON YYYY 即使应用程序语言要更改 法语
  • 安装 Enthought Canopy 后安装 python 模块“rpy2”

    我的一些 python 脚本使用 rpy2 作为 R 的接口 它与之前的 Enthought EPD python 完美配合 我最近安装了 Enthought 的 Canopy Python Python 现在不再找到 rpy2 模块 当我
  • rpart节点分配

    是否可以提取拟合的节点分配rpart树 当我将模型应用于新数据时会怎样 我的想法是 我想使用节点作为数据集群的一种方式 在其他软件包 例如 SPSS 中 我可以保存预测的类 概率和节点号以供进一步分析 鉴于 R 的强大功能 我想有一个简单的
  • python 中的 zip(),如何使用静态值

    我正在尝试构建一个元组数组 其中包含列表中的第一个值和一些静态值 这应该很简单 但由于某种原因我很难做到这一点 例如 我如何获得以下内容 1 100 200 2 100 200 3 100 200 4 100 200 5 100 200 g
  • JQuery TableSorter:排序箭头不显示

    我正在实现 jQuery 的表格排序器 但箭头似乎无法显示 这是我到目前为止所做的 and document ready function myTable tablesorter 该表排序良好 但箭头不显示 我在这里错过了什么吗 我什至添加
  • 如何提高 jQuery 的性能

    我有一个用 jsp 和 jQuery 编写的聊天应用程序 我对在某个 URL 中连续发布请求的线程使用了 setTimeout 方法 我的浏览器在一段时间后挂起 CPU 利用率非常高 有什么办法可以提高JS的性能吗 检查这个 http ww
  • JPA ID生成策略

    我为 JPA 类定义了一个生成器
  • install_github("riv","tomasgreif") parse_repo_spec(repo) 中的错误:无效的 git repo 规范:'riv'

    在尝试 install github riv tomasgreif 我收到以下错误 parse repo spec repo 中的错误 无效的 git repo 规范 riv Use of install github riv tomasg
  • Spring MVC 应用程序的构建错误

    我对 Spring 框架相当陌生 我最近安装了 SpringSource Tool Suite 版本 2 8 1 RELEASE 使用 Subclipse 我查看了我的队友创建的 Spring MVC 项目 它在他的机器上运行良好 但我们无
  • 出现错误数据库未选择

    code
  • sails:使用内置增删改查操作创建模型后如何重定向?

    我正在使用 Node js 的 Sails 框架进行一些快速测试 我喜欢默认 CRUD 操作开箱即用的方式 一旦模型和控制器 例如 user 被创建 不过 我在扩展基础知识方面遇到了一些麻烦 Say 我创建了一个用户模型和空的用户控制器 这
  • Amazon Alexa 意图动态变量

    我正在尝试构建一个 Alexa 技能套件 用户可以通过说类似的话来调用意图 GetFriendLocation where is Friend 为了让 Alexa 识别变量friend 我必须定义所有可能的值LIST OF Friends文
  • 将 git 存储库及其所有历史记录导入到现有 git 存储库中

    我有两个 git 存储库 我想将它们合并在一起而不丢失它们的提交历史记录 我试过这个 cd firstRepo git remote add other path to otherRepo git fetch other git check
  • 当我一步编译所有内容时,GCC 可以更好地优化事情吗?

    当我传递它时 gcc 会优化代码 O2标志 但我想知道如果我将所有源文件编译为目标文件 然后再链接它们 它实际上可以做到多好 这是一个例子 in a h int foo int n in foo cpp int foo int n retu