String Delphi7函数-字符串还是短字符串?整数还是字?
我是一个“性能”程序员,有一个基本的理论问题:Delphi7是否有一些“方法”来识别所使用的字符串类型并自动定义正确的类型 例如,当您知道函数的结果字符串长度总是小于255时,您会使用: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中也是如此
函数SomeFunction:String
或函数SomeFunction:ShortString代码>
同样的想法:
function SomeFunction(Num:Integer):整数代码>或函数somefunctiont(Num:Byte):字代码>?永远不要将短字符串
与函数一起使用,即使在Delphi 7中也是如此
当用作函数结果时,始终复制短字符串
完整内容(即所有字符)
因此,它将比使用普通的string
变量慢,该变量只会增加字符串的内部引用计数,而不会复制字符
由于大多数Delphi RTL/VCL库都使用string
,因此在代码中使用shortstring
将为这些方法的每次调用添加大量转换,而在使用普通string
时则不是这样。当调用Windows API时,delphistring
类型已经是零结束的,因此将避免任何分配和转换,这在使用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时,delphistring
类型已经是零结束的,因此将避免任何分配和转换,这在使用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是否有一些方法来识别使用的字符串类型