Delphi XE如何禁用RTTI?

10

最近我使用了Delphi XE,但是由于RTTI(我认为)导致exe文件大小非常大。

如何删除RTTI,并使我的应用程序大小与Delphi 2009应用程序(490 KB)一样小,而不需要压缩;以及RTTI的用途是什么。


2
你的exe有多大?你期望它有多大? - Harriv
5个回答

17

+1 对于精确语句,否则你需要通过挖掘文档来查找,因为它们大多是针对如何使用它而不是如何关闭它。 - Marjan Venema
当您在我的D2010上使用RTTI语句时,会导致编译器错误:DCC致命错误:E2158系统单元已过期或损坏:缺少TVisibilityClasses。有什么建议吗? - RobertFrank
你正在尝试重新编译系统单元吗?也许你应该在这里提出一个新问题 - 这样更多的人会看到它。http://docwiki.embarcadero.com/RADStudio/en/E2158_%25s_unit_out_of_date_or_corrupted_-_missing_'%25s'_%28Delphi%29 - gabr
为什么在DLL项目中默认没有关闭它?如果没有性能差异的话。 - mca64
链接:https://docwiki.embarcadero.com/RADStudio/Alexandria/en/RTTI_directive_(Delphi) 说:范围:本地(答案中的链接不再可用) - mjn

8

+1 对于提供背景信息的链接,不过如果您直接在回答中提供了 gabr 现在所做的声明,那就更好了。 - Marjan Venema

7

您的问题与RTTI无关。如果您说的是相对较小的增加(100-200K),那么这是由于RTL中的额外函数(添加了Unicode支持等)。如果增加了500-700K左右,请检查是否链接了VCL UI单元(如Forms、Controls等)。如果增加了3Mb,则说明您已经打开了额外的调试符号。


但我认为Unicode已经在Delphi 2009中了(基本应用程序只有499 KB),但是在Delphi XE VCL中没有太大的改进(Delphi XE应用程序大小为800 KB),所以我认为额外的300 KB主要来自RTTI。而D2007应用程序(不带Unicode)大小约为350 KB。 - VibeeshanRC
你认为为什么 Delphi 2009 中没有提供 RTTI(运行时类型信息)? - Eugene Mayevski 'Callback
@Eugene:你为什么认为这是Unicode函数,如果Unicode函数_替换_了ANSI函数,而不是添加了呢?另外,关于Delphi的“智能链接器”在哪里?...如果它无法弄清楚代码中很大一部分是不必要的,那么它或许并不那么智能。 - 0xC0000022L
@STATUS_ACCESS_DENIED Unicode函数并没有取代ANSI函数,而是扩展了它们。也就是说,现在有些函数存在着ANSI和Unicode两个变体。 - Eugene Mayevski 'Callback
@Eugene:那些我们正在谈论的还只是运行时函数吗?如果最终成为常量或静态数据的字符串都是Unicode,那么所谓的“智能链接器”为什么不会抛弃那些无用地占用我二进制文件空间的函数呢?不过我理解你的观点。我想Unicode的实现方式(并作为遗留问题延续下去)并没有使事情变得更好。 - 0xC0000022L

4
因为一些泛型功能已经添加到系统单元中。 泛型是在2009年添加的,但在XE和XE2中,一些类已经被重写为泛型。在我看来。 将这些标志添加到每个单独的单元中(从XE5开始),以减小文件大小(在dpr文件中添加标志(项目>查看源代码))。
{$SETPEFlAGS IMAGE_FILE_DEBUG_STRIPPED or IMAGE_FILE_LINE_NUMS_STRIPPED or
 IMAGE_FILE_LOCAL_SYMS_STRIPPED OR IMAGE_FILE_RELOCS_STRIPPED}

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

(*) 注意,从XE5开始,这需要在您想要禁用RTTI的每个单元中设置。 在此之前(XE4及更早版本),它可以放在DPR文件中,并适用于项目中的所有单元。


3

我不认为是RTTI导致应用程序增加了如此多的大小开销。你怎么知道它是这个原因呢?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接