关闭RTTI反射机制,减小Delphi2010程序的尺寸

简介: 自从Delphi2010增强了RTTI反射机制后,编译出来的程序变得更大了,这是因为默认情况下 Delphi2010 给所有类都加上了RTTI信息(呵呵,不管你用不用它,好像实用价值确实不高,至少目前我不会去用的)。

自从Delphi2010增强了RTTI反射机制后,编译出来的程序变得更大了,这是因为默认情况下 Delphi2010 给所有类都加上了RTTI信息(呵呵,不管你用不用它,好像实用价值确实不高,至少目前我不会去用的)。虽说对程序的运行速度影响不大,但会增加安装程序的大小,这也是我们不愿看到的。有没有办法禁用RTTI信息,从而减小编译后程序的大小呢?,从文档中我们找到了方法。


一、在工程中用编译指令禁用RTTI


禁用的方法很简单,就是要在工程(dpr文件中。Delphi2010下项目文件是dproj文件,但dpr文件仍然是默认的编写代码的项目文件)的Uses语句前添加下面的定义就可以了:

{ Reduce EXE size by disabling as much of RTTI as possible (delphi 2009/2010) }

{$IF CompilerVersion >= 21.0}

{$WEAKLINKRTTI ON}

{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}

{$IFEND}


OK,这样重新编译后你会发现,确实把EXE文件大小减小了,但这还不够,请继续往下看。


二、重建无RTTI信息的VCL/RTL


下面我们进行关键的操作,因为VCL和RTL单元还是带RTTI信息的,我们要把它们的RTTI信息去掉。打开delphi2010新建一个工程,并保存,这里我们为方便讨论,把它保存到c:/nortti目录,在它下面建一子目录delphi2010,完成后目录如下:c:/nortti/delphi2010。

在DPR的uses段中添加所有使用到的VCL/RTL单元,呵呵,这样可能会很乱,所以我把所有单元名放到一个包含文件中去了(.INC文件),引用一下就可以了(注意,这里是所有单元名,真正使用时你只需保留用到的单元名),然后单击project菜单中的options项,编辑Unit output directory项的值为 c:/nortti/delphi2010。编译该项目,如果有错误提示,就删除那些单元引用。(注:当JPEG单元重建时你需要拷贝Source/Win32/vcl/Imaging/JPGImage/obj目录下的文件到你项目的目录),编译完成后关闭项目。

提示:可以用下面这个批处理文件产生上面说的单元列表

@echo off

del unitlist.inc

dir /b "C:/Program Files/Embarcadero/RAD Studio/7.0/source/Win32/vcl/*.pas" >> unitlist.inc

dir /b "C:/Program Files/Embarcadero/RAD Studio/7.0/source/Win32/rtl/win/*.pas" >> unitlist.inc

dir /b "C:/Program Files/Embarcadero/RAD Studio/7.0/source/Win32/rtl/common/*.pas" >> unitlist.inc


rem Manually add some system units (we cannot add the entire dir or problems crop up)

echo SysUtils.pas >> unitlist.inc

echo Types.pas >> unitlist.inc

echo Variants.pas >> unitlist.inc

echo VarUtils.pas >> unitlist.inc

然后打开生成的unitlist.in文件,查找并替换所有的?.pas?为?,?。

呵呵,说了这么多,大家有点晕吧,还好,作者提供了一个项目,http://www.zipplet.co.uk/getfile.php/rttidisable.zip,大家下载下来后,修改一下就可以直接用,记得要修改输出目录哟!


三、在工程中使用新生成的单元


打开delphi2010,修改全局单元查找路径,因为编译器总是按顺序查找单元,我们修改后让它去使用我们重建的单元。

Tool菜单 -> Options 菜单, 浏览 Environment Options -> Delphi Options -> Library - Win32。在Library path最前面添加我们重建单元的完整路径。

这样做后,新建工程就会自动使用我们重建的无RTTI的单元了。最后别忘了在DPR工程中使用编译指令禁用RTTI哟!

各位可以自己比较一下编译后的文件大小,还是很明显的,另外大家还可以用upx、aspack压缩一下,那样EXE就会更小了。

 

本文来自Delphi园地,转载请标明出处:http://www.delphifans.com/infoView/Article_6493.html

相关文章
|
5月前
|
数据可视化 程序员 C#
C#中windows应用窗体程序的输入输出方法实例
C#中windows应用窗体程序的输入输出方法实例
85 0
|
7月前
|
C# 图形学 数据安全/隐私保护
Unity数据加密☀️反射的用法:变量、属性、方法、重载,反射在DLL中的使用方法
Unity数据加密☀️反射的用法:变量、属性、方法、重载,反射在DLL中的使用方法
|
10月前
|
Linux API C++
【C++ 线程包裹类设计】跨平台C++线程包装类:属性设置与平台差异的全面探讨
【C++ 线程包裹类设计】跨平台C++线程包装类:属性设置与平台差异的全面探讨
156 2
|
10月前
|
开发框架 安全 编译器
【C/C++ 深入探讨构函数】C++ 编译器在什么情况下无法生成默认的析构函数?
【C/C++ 深入探讨构函数】C++ 编译器在什么情况下无法生成默认的析构函数?
199 1
|
开发框架 .NET API
绝顶技术:断点+内存映射组合的 CLR 超强 BUG?
你见过【断点+内存映射】制造了一个另类隐藏极深,强悍的 BUG 吗?这是一个虚拟机 CLR 的 BUG。不同于之前所遇见的 BUG 这次费时最多,但是问题已然清晰。
244 0
|
存储 编译器 C语言
0基础C语言自学教程——第九节 从底层汇编的角度简单理解函数栈帧的创建和销毁
我们在现在,其实已经比较清楚函数是怎么样运行的了,包括怎样传参 、函数调用等等。但是呢,这样也只是理解到了会用的地步。
190 0
0基础C语言自学教程——第九节 从底层汇编的角度简单理解函数栈帧的创建和销毁
|
存储 网络协议 C语言
【CSAPP】x86-64的机器代码和原始的C代码差别巨大,一些常在C语言中隐藏的处理器状态
【CSAPP】x86-64的机器代码和原始的C代码差别巨大,一些常在C语言中隐藏的处理器状态
106 0
|
安全 编译器 C++
C++实用技巧分享,控制对象创建
C++实用技巧分享,控制对象创建
Qt [GC9-8]:让我们的程序可以随意的移动(重载鼠标事件)
Qt [GC9-8]:让我们的程序可以随意的移动(重载鼠标事件)
188 0
Qt [GC9-8]:让我们的程序可以随意的移动(重载鼠标事件)
MFC双缓冲+提升绘图效率方法(号称三缓冲):自定义静态背景不频繁擦除(★firecat推荐★)
MFC双缓冲+提升绘图效率方法(号称三缓冲):自定义静态背景不频繁擦除(★firecat推荐★)
558 0
MFC双缓冲+提升绘图效率方法(号称三缓冲):自定义静态背景不频繁擦除(★firecat推荐★)