他们有何区别?(函数) 有二个delphi函数他们有何区别?function IniStrToStr(const Str: string): string;function IniStrToStr(Str: string): string; 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 汗一個,偶在delphi help咋沒查到你寫的函數呢... 对于动态字符来说,没区别///////////////////////////////Const参数的传递方式与参数类型相关,有数值传送和地址传送两种。对于结构类型、串类型(包括短串)、Variant、动态数组,Const参数传递的是地址,比无Const参数传递效率高。 长串实际上是个隐含的指针,长串参数的传递方式比较特殊,无论有无Const都只传递长串的指针值,它指向动态分配内存区(堆)。有Const的长串参数在函数内是只读的,无Const的长串参数在函数内部可修改,虽然它与实参指向同一快内存,但由于长串具有“copy-on-write”特性,在对长串形参进行修改前将复制出新的长串,故不影响实参。 短串参数也只传递32bit的指针,无Const时,函数将在堆栈中预留的256Byte空间内复制出新的短串,作为形式参数使用。 使用者来说没区别函数本身区别在于,str这个变量能不能再作赋值用,const的就不能在函数中=另一个值,也可以说没区别,区别在于const只是一个好习惯 是否可以把长串、短串理解为:长串即string类型的数据;短串是 type ShortStr = string[N]; N在1到255之间的任意一个值。 有了const,编译器不在进行保护性的工作好像有本书上说能提高好多效率 用CPU查看器分析一下编译后的机器指令(汇编)function IniStrToStr1(const Str: string): string;begin Result := Str + '!';end;const参数编译后PUSH EBXPUSH ESIMOV ESI,EDXMOV EBX,EAXMOV EAX,ESIMOV ECX,$????????MOV EDX,EBXCALL @LStrCat3POP ESIPOP EBXRETfunction IniStrToStr2(Str: string): string;begin Result := Str + '!';end;非const参数编译后PUSH EBPMOV EBP,ESPPUSH ECXPUSH EBXMOV EBX,EDXMOV DWORD PTR [EBP-$04],EAXMOV EAX,DWORD PTR [EBP-$04]CALL @LStrAddRefXOR EAX,EAXPUSH EBPPUSH $0044F145PUSH FS:DWORD PTR [EAX]MOV FS:DWORD PTR [EAX],ESPMOV EAX,EBXMOV ECX,$0044F158MOV EDX,DWORD PTR [EBP-$04]CALL @LStrCat3XOR EAX,EAXPOP EDXPOP ECXPOP ECXMOV FS:DWORD PTR [EAX],EDXPUSH $0044F14CLEA EAX,DWORD PTR [EBP-$04]CALL @LStrClrRET结论是const参数编译器做了优化,效率比非const参数高些(普通机器差别在0.001毫秒以内)非const参数可以当局部变量使用function IniStrToStr(Str: string): string;begin Str := Str + 'Zswang 路过'; // 类似局部变量 Result := Str + '!';end;而const参数不能再赋值效率和灵活性是取舍的问题通过管理帖子结贴。 function IniStrToStr(const Str: string): string; function IniStrToStr(Str: string): string;Const str:string 在函数体内其值是不可以写入的!Str:String; 反之 XMLHTTP返回值的解码 请介绍个调试追踪软件 关于两个form同时显示 请高手帮我看一下代码错在什么地方很简单??在线 如何使intraweb生成的WEBFORM全屏,没有浏览器的菜单栏,工具栏,地址栏 ? 谁有IE的向前向后的图标?? 怎样写自动关机程序 线程的基本问题, 新人... 为什么我的statusbar没有反应 大问题 dbexpsda -- dbExpress for SQL Server 4.20问题,知道的兄弟说一下 fastreport3.25为什么没有TfrChartObject?
///////////////////////////////
Const参数的传递方式与参数类型相关,有数值传送和地址传送两种。对于结
构类型、串类型(包括短串)、Variant、动态数组,Const参数传递的是地址,
比无Const参数传递效率高。
长串实际上是个隐含的指针,长串参数的传递方式比较特殊,无论有无Const
都只传递长串的指针值,它指向动态分配内存区(堆)。有Const的长串参数在
函数内是只读的,无Const的长串参数在函数内部可修改,虽然它与实参指向同
一快内存,但由于长串具有“copy-on-write”特性,在对长串形参进行修改前
将复制出新的长串,故不影响实参。
短串参数也只传递32bit的指针,无Const时,函数将在堆栈中预留的256Byte
空间内复制出新的短串,作为形式参数使用。
函数本身区别在于,str这个变量能不能再作赋值用,const的就不能在函数中=另一个值,也可以说没区别,区别在于const只是一个好习惯
短串是 type ShortStr = string[N]; N在1到255之间的任意一个值。
好像有本书上说能提高好多效率
function IniStrToStr1(const Str: string): string;
begin
Result := Str + '!';
end;
const参数编译后
PUSH EBX
PUSH ESI
MOV ESI,EDX
MOV EBX,EAX
MOV EAX,ESI
MOV ECX,$????????
MOV EDX,EBX
CALL @LStrCat3
POP ESI
POP EBX
RETfunction IniStrToStr2(Str: string): string;
begin
Result := Str + '!';
end;
非const参数编译后
PUSH EBP
MOV EBP,ESP
PUSH ECX
PUSH EBX
MOV EBX,EDX
MOV DWORD PTR [EBP-$04],EAX
MOV EAX,DWORD PTR [EBP-$04]
CALL @LStrAddRef
XOR EAX,EAX
PUSH EBP
PUSH $0044F145
PUSH FS:DWORD PTR [EAX]
MOV FS:DWORD PTR [EAX],ESP
MOV EAX,EBX
MOV ECX,$0044F158
MOV EDX,DWORD PTR [EBP-$04]
CALL @LStrCat3
XOR EAX,EAX
POP EDX
POP ECX
POP ECX
MOV FS:DWORD PTR [EAX],EDX
PUSH $0044F14C
LEA EAX,DWORD PTR [EBP-$04]
CALL @LStrClr
RET结论是const参数编译器做了优化,效率比非const参数高些(普通机器差别在0.001毫秒以内)非const参数可以当局部变量使用
function IniStrToStr(Str: string): string;
begin
Str := Str + 'Zswang 路过'; // 类似局部变量
Result := Str + '!';
end;
而const参数不能再赋值效率和灵活性是取舍的问题通过管理帖子结贴。
function IniStrToStr(Str: string): string;Const str:string 在函数体内其值是不可以写入的!
Str:String; 反之