C++;生成器链接器支持功能级链接? 我用C++ Builder编写的各种项目,工作了近两年。在这段时间里,我注意到了一些和生成的可执行文件的大小有关的事情。我试着用两个例子来描述它: 今天我将一个项目从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!)

C++;生成器链接器支持功能级链接? 我用C++ Builder编写的各种项目,工作了近两年。在这段时间里,我注意到了一些和生成的可执行文件的大小有关的事情。我试着用两个例子来描述它: 今天我将一个项目从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!),c++,linker,c++builder,c++builder-xe2,C++,Linker,C++builder,C++builder Xe2,这两个二进制文件都编译为带有附加库的静态链接的发行版。除了更改定义库版本的全局变量和包含产品信息(版本、说明、公司等)的可执行属性外,这两个版本之间没有源代码更改 2。我在C++ Cuilder XE2中添加了一些VCL项目,这些文件来自JCL(绝地代码库)项目。我的代码中没有创建来自JCL的对象,因此我认为链接器不应该链接新方法,即使它们是代码的一部分。然而,二进制大小从1790000增加到1930000。我没有确切的数字,因为还有其他一些小变化。这一增长的一小部分可以归因于链接了170 k

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

<> 2。我在C++ Cuilder XE2中添加了一些VCL项目,这些文件来自JCL(绝地代码库)项目。我的代码中没有创建来自JCL的对象,因此我认为链接器不应该链接新方法,即使它们是代码的一部分。然而,二进制大小从1790000增加到1930000。我没有确切的数字,因为还有其他一些小变化。这一增长的一小部分可以归因于链接了170 kB的资源文件JclUnicode.res。然而,这与我的长期经验是一致的,即当向项目中添加一些外部组件时,如果我们将其与最终用户的新功能进行比较,则二进制大小的结果变化是不合适的


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

关于不同版本中可执行文件大小增加的相关问题,已经进行了大量讨论。BCB6和XE4之间的RTL/VCL发生了重大变化。转换到Unicode、引入Delphi泛型和扩展RTTI等等。它们都会增加文件大小。尤其是在C++ Builder中,它不能过滤掉未使用的RTL/VCL代码,尤其是增强型RTI,特别是增强型RTI,而且Delphi泛型还没有很好的优化,与C++模板相比。