【发布时间】:2011-06-16 10:56:51
【问题描述】:
在讨论this话题时,我问了自己以下问题。
在某些情况下,翻译单元中的一些未使用代码会链接到 GCC 和 VC++ 等流行编译器的最终可执行代码(当然是在发布模式下)?
例如假设我们有 2 个编译单元:
//A.hpp
//Here are declarations of some classes, functions, extern variables etc.
还有源文件
//A.cpp
//defination of A.hpp declarations
最后是主要的
//main.cpp
//including A.hpp library
#include "A.hpp"
//here we will use some stuff from A.hpp library, but not everything
我的问题是。如果在 main.cpp 中没有使用 A.hpp 中的所有内容怎么办?链接器是否会删除所有未使用的代码,或者在某些情况下,某些未使用的代码可以链接到可执行文件?
编辑:我对 G++ 和 VC++ 链接器感兴趣。
编辑:当然我的意思是在发布模式下。
编辑:我开始赏金这个问题,以获得好的和完整的答案。我期待答案,它将解释在哪些情况下 g++ 和 VC++ 链接器正在链接垃圾以及它们能够从可执行文件中删除什么样的代码(不需要的函数、不需要的全局变量、不需要的类定义等)和为什么他们不能删除某种不需要的东西。
【问题讨论】:
-
请指定编译器。
-
对于 GCC,在 SO 中搜索
-gc-sections。我以前回答过这个问题。我认为它被称为 VC++ 的函数级链接。 -
@leppie 我在互联网上搜索了函数级链接。好的,这是部分答案,但是类、外部变量等呢?他们是否也会从可执行文件中删除? gcc 也有类似的东西吗?
标签: c++ optimization linker