我在用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%。
答案 0 :(得分:3)
关于Embarcadero's forums与各种版本中可执行文件大小的增加有关的讨论很多。 BCB6和XE4之间的RTL / VCL发生了实质性变化。切换到Unicode,引入Delphi Generics和Extended RTTI等等。它们都有助于文件大小。特别是在C ++ Builder中,它不能过滤掉未使用的RTL / VCL代码以及Delphi,尤其是增强型RTTI,但与C ++模板相比,Delphi Generics还没有很好的优化。