首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >g++优化标志:-fuse-linker-plugin vs -Flags program

g++优化标志:-fuse-linker-plugin vs -Flags program
EN

Stack Overflow用户
提问于 2013-03-25 11:09:15
回答 1查看 14.2K关注 0票数 22

我正在读:

http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

它首先表明:

不应使用此选项(-fwhole-program)与-flto结合使用。相反,依赖链接器插件应该为提供更安全、更精确的信息。

然后,它暗示:

如果程序不需要导出任何符号,则可以将-flto-fwhole-program结合起来,以允许过程间优化器使用更激进的假设,这可能会带来更好的优化机会。当链接器插件处于活动状态时,不需要使用-fwhole-program (参见-fuse-linker-plugin)。

这是否意味着从理论上讲,在-flto中使用-fuse-linker-plugin总是比在-flto中使用-fwhole-program获得更好的优化可执行文件

我尝试使用ld分别连接-fuse-linker-plugin-fwhole-program,但可执行文件的大小至少是不同的。

附注:我在CentOS 6上使用的是gcc 4.6.2和ld 2.21.53.0.1。

EN

回答 1

Stack Overflow用户

发布于 2017-02-09 14:54:21

更新:参见下面的@PeterCordes评论。本质上,-fuse-linker-plugin不再是必需的。

这些差异是微妙的。首先,了解-flto的实际用途。它本质上创建了一个可以在以后优化的输出(在“链接时”)。

- case 所做的是假设“当前编译单元代表正在编译的整个程序”,而不管实际情况是否如此。因此,GCC将假设它知道调用特定函数的所有位置。正如它所说的,它可能会使用更积极的过程间优化器。我稍后会解释这一点。

最后,-fuse-linker-plugin实际上是在链接时执行通常在执行每个编译单元时执行的优化。因此,这个插件被设计成与-flto配对,因为-flto意味着保存足够的信息以便以后进行优化,而-fuse-linker-plugin意味着实际执行这些优化。

那么,它们的不同之处在哪里?嗯,正如GCC文档所建议的那样,使用- Well program在原则上没有优势,因为该选项假设了一些您必须确保为真的东西。要打破它,只需在一个.cpp文件中定义一个函数,然后在另一个文件中使用它。你会得到一个链接器错误。

全程序有什么优势吗?好吧,如果你只有一个编译单元,那么你可以使用它,但老实说,它也不会更好。我能够通过使用等价的程序获得不同大小的可执行文件,但当检查实际生成的机器代码时,它们是相同的。事实上,我看到的唯一区别是带有调试信息的行号是不同的。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15606993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档