跨翻译单元和 gcc 4.6 自动内联函数

2023-11-26

如果我不将函数 f 声明为内联。如下:

A.h:

X f(Y y);

A.cpp:

X f(Y y)
{
    ...
}

然后在不同的翻译单元中:

B.cpp:

#include "A.h"

Z g(W w)
{
    ...
    ... f(...) ...
    ...
}

然后我用 gcc 4.6 编译两个翻译单元 A.o 和 B.o,然后也通过 gcc 链接它们。 (也许两个步骤都加上 -O3)

gcc 会考虑在链接时内联函数以提高性能吗?还是太晚了?

在代码审查中,有人建议我不应该将我的函数声明为内联,因为编译器比我更清楚何时内联。我总是有这样的印象,除非该函数是在标头中定义的,否则编译器没有内联它的选项。

(如果 C 模式、C++ 模式或 gnu++0x 模式的答案不同,也请指出)


该功能称为链接时间优化(LTO)在 GCC 4.6 中默认不启用

[编辑] 启用 LTO 后,GCC 将保存以下内容的“GIMPLE”表示:X f(Y y) in A.obj。这种表示比通常的 C++ 预处理稍微多一些,但也不是很多。特别是,它还没有翻译成汇编。因此,链接器仍然可以内联它。

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

跨翻译单元和 gcc 4.6 自动内联函数 的相关文章

随机推荐

  • 角度路由 - 重定向到外部站点?

    在 AngularJS 路由文件中 有一个选项otherwise路由 替换 404 routeProvider when otherwise redirectTo my path 有没有办法做到这一点 以便重定向到不在应用程序中的页面 我试
  • 保持终端焦点

    我有一个 python 脚本 它使用 selenium 来自动化网页 将焦点从需要用户输入的终端上移开 python 中是否有以编程方式将焦点切换回终端的方法 如果重要的话 我将在 Windows 7 上的 Windows 命令提示符中运行
  • 长周期区块应用

    我的应用程序中有以下循环 var maxIterations Int 0 func calculatePoint cn Complex gt Int let threshold Double 2 var z Complex init re
  • const 的用处 (C++)

    我是一个 const 恶魔 我努力让一切尽可能 const 我尝试查看 const 和非 const 版本函数的各种反汇编输出 但尚未看到明显的改进 我假设现在的编译器能够使用非 const 函数来完成聪明的事情 而这些函数在技术上可能是
  • 从长到宽,重复两次测量

    我知道这个问题已经在 从长到宽 的标题下被问过很多次了 但我遇到了一种情况 我有两个重复测量的值变量 id sex time score1 score2 1 subject 1 m Time1 0 20926263 0 2499310 2
  • winutils.exe chmod 命令未设置权限

    gt D gt echo HADOOP HOME gt D Apps winutils hadoop 2 7 1 在与 HADOOP HOME 相同的磁盘上创建 tmp hive 文件夹 D gt dir tmp hive Director
  • 为什么 Jetpack Compose Preview 不显示任何内容?

    我正在使用 Jetpack Compose 预览仅显示标题 但如果我使用 dev13 版本 它工作正常 IDE Android Studio 4 2 Canary 7撰写 0 1 0 dev17 这是一个已知问题 它应该在 Android
  • Django 管理,自定义错误消息?

    我想知道如何在 Django 管理中显示错误消息 我的网站上有一个私人用户部分 用户可以在其中使用 点 创建请求 一个请求从用户的帐户中获取 1 或 2 个积分 取决于请求的两种类型 因此如果帐户有 0 个积分 则用户无法发出任何请求 在私
  • 无法加载文件或程序集“xxxx”或其依赖项之一。该系统找不到指定的文件

    在 VS2005 中 我们整个编程人员都收到此错误消息零星地它总是在贝尼控制项目 此错误消息每天会发生多次 并且在进入控件的设计模式时会发生 通常重建贝尼控制解决了问题 但有时必须重建整个解决方案 还有其他人解决了这个问题吗 有哪些建议或网
  • 在 ncurses 中捕获 control+key 的正确方法

    在 ncurses 中捕获 control key 的正确方法是什么 当前我正在这样做定义控制 如下所示 define ctl x x 0x1f 它工作正常 但问题是我无法同时捕获 C j 和 ENTER 这是因为 j 106 110101
  • java中可以连续分配对象吗?

    假设我有一大堆相对较小的对象 我需要经常迭代它们 我想通过提高缓存性能来优化我的迭代 所以我想分配物体 而不是引用 在内存上连续 所以我会得到更少的缓存未命中 并且整体性能可能会明显更好 在 C 中 我可以只分配一个对象数组 它会根据我的需
  • 为什么可以在持久卷上设置多个访问模式?

    例如在下面的例子中 apiVersion v1 kind PersistentVolumeClaim metadata name exmaple pvc spec accessModes ReadOnlyMany ReadWriteMany
  • 如何在 Java 程序中运行 Java 源代码

    我写了一些代码来编译Java源代码 然后它会生成 class 文件 问题是我该如何运行它 例如 我可以设置程序和类的名称 我使用了 prog p new prog 但是在这种情况下 类文件在编译之前还不存在 不太确定该怎么做 有人可以给我建
  • Oracle 何时/为何将 NaN 添加到数据库表中的行

    我知道 NaN 代表非数字 但是 我很难理解 Oracle 何时以及为何将其添加到一行中 是遇到小于 0 的值 如负数 还是垃圾值时 从文档中 Oracle 数据库数字数据类型存储正负定点和浮点数 零 无穷大以及作为未定义运算结果的值 不是
  • iPhone 上的 JSON POST 请求(使用 HTTPS)

    我托管了一个 WCF 服务 并且尝试在 iPhone 应用程序中将其用作 JSON POST 请求 我计划稍后使用 JSON 序列化器 但这就是我的请求 NSString jsonRequest username user password
  • 精确检查一个布尔选项集

    嗯 这有点hacky function b2n boo return boo 1 0 if b2n opt1 b2n opt2 b2n opt3 1 throw new Error Exactly one option must be se
  • Android Studio 无法与 HoloEverywhere 和 ActionBarSherlock 配合使用

    我能够将 ActionBarSherlock 和 HoloEverywhere 导入 Android Studio 但无法编译我的应用程序 截屏 https docs google com file d 0BwOn70drOiMfZHZVe
  • hibernate 4.3.x - 加载所有实体注释类

    在我从事的项目中 我不使用 Spring 仅使用 Hibernate 我不想使用 hbm xml 文件进行实体映射 描述 等 我只想使用注释 我如何告诉 Hibernate 加载所有内容Entity Table来自某些包的带注释的类 我在网
  • 在 Python 中实现可观察集合的推荐方法?

    我希望在 Python 中有一些可观察的集合 序列 让我能够监听更改事件 例如添加新项目或更新项目 list ObservableList a b c list addChangeListener lambda new value prin
  • 跨翻译单元和 gcc 4.6 自动内联函数

    如果我不将函数 f 声明为内联 如下 A h X f Y y A cpp X f Y y 然后在不同的翻译单元中 B cpp include A h Z g W w f 然后我用 gcc 4 6 编译两个翻译单元 A o 和 B o 然后也