【发布时间】:2010-07-18 08:08:18
【问题描述】:
编译是即时完成的: 只有 CImg 功能真正使用 由您的程序编译并 出现在编译的可执行文件中 程序。这导致非常紧凑 代码,没有任何未使用的东西。
有人知道原理吗?
【问题讨论】:
-
这句话的出处是什么?
-
CImg 是一个开源项目。
编译是即时完成的: 只有 CImg 功能真正使用 由您的程序编译并 出现在编译的可执行文件中 程序。这导致非常紧凑 代码,没有任何未使用的东西。
有人知道原理吗?
【问题讨论】:
CImg 是一个只有头文件的库,他们大量使用模板,这就是他们所指的。
如果他们使用某种类型的预编译库 (.dll/.lib/.a/.so),则库文件必须包含 整个 CImg 库,无论其中包含哪些位你实际使用。
对于静态链接库(.lib 或 .a),链接器可以去除未使用的符号,但这可能取决于优化设置。
当整个库包含在一个或两个头文件中时,它只有在你#include它时才会真正编译,因此它与你程序的其余部分是同一编译过程的一部分,编译器可以很容易地确定库的哪些部分被使用,哪些不被使用。
而且由于 CImg API 使用模板,因此不会为从未调用的函数生成代码。
不过他们有点超卖了,因为正如其他答案所指出的那样,未使用的符号通常会被删除无论如何。
【讨论】:
对我来说听起来像是相当标准的行为 - C++ 链接器通常会丢弃任何未使用的库引用,而不是包含不可调用的代码。同样,优化的构建不会包含不可调用的代码。
【讨论】:
这听起来像 MSVC 的 Eliminate Unreferenced Data (/OPT:REF) 链接器命令,GCC 也应该有类似的东西
【讨论】: