3

我在用 C++ Builder 编写的各种项目上工作了将近两年。在此期间,我注意到一些与生成的可执行文件大小有关的事情。我试着用两个例子来描述它:

1.今天我将一个项目从 C++ Builder 6 转换为 C++ Builder XE4。这是DLL大小的比较:

Old DLL      531 968 B

New DLL    3 422 720 B (or more than 6x larger than old one!)

两个二进制文件都编译为带有附加库的静态链接的发行版。除了更改定义​​库版本的全局变量和包含产品信息(版本、描述、公司等)的可执行属性外,这两个版本之间没有源代码更改。

2.我在用 C++ Builder XE2 编写的 VCL 项目中添加了一些来自 JCL(JEDI 代码库)项目的文件。我的代码中没有创建来自 JCL 的对象,所以我认为链接器不应该链接新方法,即使它们是代码的一部分。尽管如此,二进制大小从 17 900 000 增加到 19 300 000。我没有确切的数字,因为还有其他细微的变化。这种增加的一小部分可以归因于链接资源文件 JclUnicode.res,它是 170 kB 大。尽管如此,这与我的长期经验是一致的,即当我们将其与最终用户的新功能进行比较时,在添加一些外部组件来投影二进制大小的结果变化时是不合适的。

我怀疑生成的二进制文件中有很大一部分代码从未被调用。不幸的是,我不知道如何验证这个假设。是否有一些工具可以分析生成的二进制文件以查找从未使用过的代码/数据?C++ Builder 链接器是否支持函数级链接?如果我们考虑到将可执行文件从硬盘驱动器读取到内存所需的时间以及程序占用的 RAM 内存大小,这是一个非常实际的问题。我正在开发嵌入式软件的同事告诉我一个故事,如何通过从固件中删除从未调用的函数将其大小减少了 80%。

4

1 回答 1

3

在Embarcadero 的论坛上已经有很多关于增加各种版本的可执行文件大小的讨论。BCB6 和 XE4 之间的 RTL/VCL 发生了重大变化。切换到 Unicode、引入 Delphi 泛型和扩展 RTTI 等。它们都对文件大小有影响。尤其是在 C++Builder 中,它不能像 Delphi 那样过滤掉未使用的 RTL/VCL 代码,尤其是增强型 RTTI,而且与 C++ 模板相比,Delphi 泛型还没有得到很好的优化。

于 2013-10-19T16:12:25.477 回答