使用resourcestring而不是const字符串是否有一些优势?

时间:2010-11-27 16:26:12

标签: delphi

你能告诉我使用时是否有一些优势(更少的存储空间,提高速度等):

resourcestring
    MsgErrInvalidInputRange = 'Invalid Message Here!';

而不是

const
    MsgErrInvalidInputRange : String = 'Invalid Message Here!';

5 个答案:

答案 0 :(得分:13)

const选项将比resourcestring更快,因为后者将调用Windows API来获取资源文本。 您可以通过使用一些缓存机制使其更快。这就是我们在增强型Delphi RTL中的作用。

如果您必须多次访问resourcestring内容,那么首先将resourcestring加载到字符串中是一个好主意。

资源字符串的要点是允许程序的i18n(国际化)。

你有翻译管理器,有一些版本的Delphi IDE。但它依赖于外部DLL。

您可以使用来自Linux世界的gettext系统,它来自http://dxgettext.po.dk,它依赖于外部.po文件。

我们在我们的框架中包含了我们自己的i18n机制,它转换和缓存资源字符串文本,并依赖于外部.txt文件(您可以使用UTF-8或Unicode文本文件,从Delphi 6到XE)。缓存使其与const使用速度一样快。见http://synopse.info/fossil/finfo?name=SQLite3/SQLite3i18n.pas

还有其他开源或商业解决方案。

关于大小存储,resourcestring存储为UC2缓冲区。所以resourcestring将使用比Delphi 2009更多的内存。自Delphi 2009以来,所有字符串都是unicodestring,即UCS2,所以你不会有更多的存储空间。在所有情况下,文本的存储大小不是应用程序的较大大小参数(位图和代码大小对最终的exe有更大的影响)。

答案 1 :(得分:6)

资源字符串在exe资源中存储为STRINGTABLE条目,consts存储为固定数据段的一部分。由于它们是资源部分的一部分,因此您可以提取它们和DFM,转换它们,并将它们存储在资源模块(仅数据DLL)中。当Delphi应用程序启动时,它会查找该DLL并使用其中的字符串而不是EXE中包含的字符串来加载翻译。

Embarcadero docwiki涵盖使用Translation Manager,但许多其他Delphi翻译工具也使用资源字符串。

答案 2 :(得分:4)

正如其他人所提到的,resourcestring字符串将包含在您的exe文件中的单独资源中,因此当您需要在应用程序的UI中满足多种语言时,它们具有优势。

正如一些人所提到的,const字符串包含在你应用的数据部分中。

D2007

在Delphi版本 D2007 中,const字符串存储为Ansi字符串,每个字符需要一个字节,而资源字符串将以UTF-16存储:windows默认编码(尽管可能不适用于Win9x)。 IIRC D2007及之前的版本不支持UTF-8编码的单元文件。因此,源代码中编码的任何字符串都必须得到ANSI代码页的支持,因此可能不会超出Unicode Basic Multilingual Plane。这意味着只使用UTF-16的UCS-2部分,并且每个字符的所有字符串都可以存储为两个字节。

简而言之:直到D2007 const字符串每个字符占用一个字节,资源字符串每个字符占用两个字节。

D2009及以上

Delphi在D2009版本中启用了unicode。从那时起事情就会有所不同。 Resourcestring字符串仍然存储为UTF-16。这里没有其他选择,因为它们由Windows“管理”。

Consts字符串然而却是完全不同的故事。由于D2009 Delphi在你的exe中存储了每个const字符串的多个版本。每个版本采用不同的编码方式。 Const可以存储为Ansi字符串,UTF-8字符串和UTF-16字符串。

这些编码中的哪一种存储取决于const的使用。默认情况下,将使用UTf-16,因为这是默认的内部Delphi编码。将相同的const分配给“普通”(UTF-16)字符串,以及AnsiString变量,并将const存储在exe文件中,包括UTF-16和Ansi编码......

<强>去欺骗

通过它的外观(试验D5和D2009),Delphi“删除”const字符串,而不是为resourcestring字符串执行此操作。

答案 3 :(得分:1)

使用resourcestring,编译器将这些字符串作为可字符串资源放入可执行文件中,允许任何人(比如您的翻译团队)使用资源编辑器编辑它们,而无需重新编译应用程序,或者可以访问源代码。 / p>

答案 4 :(得分:1)

还有第三种选择:

常量     MsgErrInvalidInputRange ='此处的消息无效!';

后者应该是性能更高的,因为告诉编译器不在数据段中分配空间,它可以将字符串放在代码段中。还要记住,使用类型常量可以完成的操作取决于$ WRITEABLECONST指令,尽管我不知道编译器何时开启或关闭。