String Delphi7函数-字符串还是短字符串?整数还是字?

String Delphi7函数-字符串还是短字符串?整数还是字?,string,performance,delphi,variables,integer,String,Performance,Delphi,Variables,Integer,我是一个“性能”程序员,有一个基本的理论问题:Delphi7是否有一些“方法”来识别所使用的字符串类型并自动定义正确的类型 例如,当您知道函数的结果字符串长度总是小于255时,您会使用: 函数SomeFunction:String或函数SomeFunction:ShortString 同样的想法: function SomeFunction(Num:Integer):整数或函数somefunctiont(Num:Byte):字?永远不要将短字符串与函数一起使用,即使在Delphi 7中也是如此

我是一个“性能”程序员,有一个基本的理论问题:Delphi7是否有一些“方法”来识别所使用的字符串类型并自动定义正确的类型

例如,当您知道函数的结果字符串长度总是小于255时,您会使用:

函数SomeFunction:String
函数SomeFunction:ShortString

同样的想法:


function SomeFunction(Num:Integer):整数
函数somefunctiont(Num:Byte):字

永远不要将
短字符串
与函数一起使用,即使在Delphi 7中也是如此

当用作函数结果时,始终复制
短字符串
完整内容(即所有字符)

因此,它将比使用普通的
string
变量慢,该变量只会增加字符串的内部引用计数,而不会复制字符

由于大多数Delphi RTL/VCL库都使用
string
,因此在代码中使用
shortstring
将为这些方法的每次调用添加大量转换,而在使用普通
string
时则不是这样。当调用Windows API时,delphi
string
类型已经是零结束的,因此将避免任何分配和转换,这在使用
shortstring
时是必要的

因此,您必须知道,
shortstring
在所有版本的Delphi中都比较慢,特别是当您用作内存管理器时:当对任何RTL/VCL/API调用使用
shortstring
时,Delphi编译器实际上会分配一些隐藏的临时
string
,因此从堆中分配一个缓冲区。。。远远没有效率:最好立即使用字符串

如果您认为
string
很慢(由于原子引用计数或内存分配不是那么多线程友好),请不要使用
shortstring
,而是使用其他结构-请参阅我的答案,如果不使用类似

对于使用
integer
值的函数,
byte/word/cardinal/integer
不会产生速度差异。我的习惯是尽可能使用
integer
,这将适合CPU寄存器的大小。只有
Int64
类型的值速度较慢,低于32位,因为它将在堆栈上使用2个寄存器或一个临时变量


更新:对于更新版本的Delphi,您将拥有“
inline
”关键字,这可能对返回此类类型的小函数的性能有很大帮助。自Delphi 2009以来,字符串是Unicode的,
shortstring
被弃用,因为它固定在系统非Unicode应用程序代码页上。只有当您确切地知道自己在做什么,并且能够使用Alt-F2并查看生成的asm代码,猜测调用了哪些隐藏的RTL函数时,才可以使用
shortstring

切勿将
shortstring
用于函数,即使在Delphi 7中也是如此

当用作函数结果时,始终复制
短字符串
完整内容(即所有字符)

因此,它将比使用普通的
string
变量慢,该变量只会增加字符串的内部引用计数,而不会复制字符

由于大多数Delphi RTL/VCL库都使用
string
,因此在代码中使用
shortstring
将为这些方法的每次调用添加大量转换,而在使用普通
string
时则不是这样。当调用Windows API时,delphi
string
类型已经是零结束的,因此将避免任何分配和转换,这在使用
shortstring
时是必要的

因此,您必须知道,
shortstring
在所有版本的Delphi中都比较慢,特别是当您用作内存管理器时:当对任何RTL/VCL/API调用使用
shortstring
时,Delphi编译器实际上会分配一些隐藏的临时
string
,因此从堆中分配一个缓冲区。。。远远没有效率:最好立即使用字符串

如果您认为
string
很慢(由于原子引用计数或内存分配不是那么多线程友好),请不要使用
shortstring
,而是使用其他结构-请参阅我的答案,如果不使用类似

对于使用
integer
值的函数,
byte/word/cardinal/integer
不会产生速度差异。我的习惯是尽可能使用
integer
,这将适合CPU寄存器的大小。只有
Int64
类型的值速度较慢,低于32位,因为它将在堆栈上使用2个寄存器或一个临时变量

更新:对于更新版本的Delphi,您将拥有“
inline
”关键字,这可能对返回此类类型的小函数的性能有很大帮助。自Delphi 2009以来,字符串是Unicode的,
shortstring
被弃用,因为它固定在系统非Unicode应用程序代码页上。只有当您确切知道自己在做什么,并且能够使用Alt-F2并查看生成的asm代码,猜测调用了哪些隐藏的RTL函数时,才可以使用
shortstring

Delphi7是否有一些方法来识别所使用的字符串类型并自动定义正确的类型

即使它提高了性能,编译器也不会进行这样的转换。为此,它需要执行所谓的数据流分析。换句话说,它需要分析数据如何通过程序流动,以及变量中可能包含的内容的原因

但编译器不执行这种分析,因此无法对 你描述的类型

Delphi 7是否有一些方法来识别使用的字符串类型