【问题标题】:Why can CImg achieve this kind of effect?CImg为什么能达到这样的效果呢?
【发布时间】:2010-07-18 08:08:18
【问题描述】:

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

有人知道原理吗?

【问题讨论】:

标签: c++ cimg


【解决方案1】:

CImg 是一个只有头文件的库,他们大量使用模板,这就是他们所指的。

如果他们使用某种类型的预编译库 (.dll/.lib/.a/.so),则库文件必须包含 整个 CImg 库,无论其中包含哪些位你实际使用。

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

当整个库包含在一个或两个头文件中时,它只有在你#include它时才会真正编译,因此它与你程序的其余部分是同一编译过程的一部分,编译器可以很容易地确定库的哪些部分被使用,哪些不被使用。

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

不过他们有点超卖了,因为正如其他答案所指出的那样,未使用的符号通常会被删除无论如何

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 你的意思是这个特性对于 C++ 链接器是自动可用的?
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-14
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多