为什么CImg能达到这种效果?

时间:2010-07-18 08:08:18

标签: c++ cimg

  

编译即时完成:   只有CImg功能才真正使用   由您的程序编译和   出现在已编译的可执行文件   程序。这导致非常紧凑   代码,没有任何未使用的东西。

任何人都知道原理吗?

3 个答案:

答案 0 :(得分:6)

CImg是一个仅限标题的库,它们使用模板,这是他们所指的。

如果他们使用某种预编译库(.dll / .lib / .a / .so),那么库文件必须包含整个 CImg库,无论它位于哪个位你真的用过。

对于静态链接库(.lib或.a),链接器可以然后删除未使用的符号,但这可能取决于优化设置。

当整个库包含在一个或两个头文件中时,它只在#include时才实际编译,因此它与程序的其余部分编译过程相同,编译器可以可以轻松确定库的哪些部分使用,哪些部分不使用。

由于CImg API使用模板,因此不会为从未调用过的函数生成代码。

虽然它们有点过分,因为正如其他答案所指出的那样,未使用的符号通常会被剥离

答案 1 :(得分:2)

对我来说听起来很标准 - C ++链接器通常会丢弃任何未使用的库引用,而不是包含不可调用的代码。同样,优化的构建将不包括不可调用的代码。

答案 2 :(得分:0)

这听起来像MSVC的Eliminate Unreferenced Data (/OPT:REF)链接器命令,GCC也应该有类似的东西