有二个delphi函数他们有何区别?
function IniStrToStr(const Str: string): string;
function IniStrToStr(Str: string): string;

解决方案 »

  1.   

    汗一個,偶在delphi help咋沒查到你寫的函數呢...
      

  2.   

    对于动态字符来说,没区别
    ///////////////////////////////
    Const参数的传递方式与参数类型相关,有数值传送和地址传送两种。对于结
    构类型、串类型(包括短串)、Variant、动态数组,Const参数传递的是地址,
    比无Const参数传递效率高。
      长串实际上是个隐含的指针,长串参数的传递方式比较特殊,无论有无Const
    都只传递长串的指针值,它指向动态分配内存区(堆)。有Const的长串参数在
    函数内是只读的,无Const的长串参数在函数内部可修改,虽然它与实参指向同
    一快内存,但由于长串具有“copy-on-write”特性,在对长串形参进行修改前
    将复制出新的长串,故不影响实参。
      短串参数也只传递32bit的指针,无Const时,函数将在堆栈中预留的256Byte
    空间内复制出新的短串,作为形式参数使用。
      

  3.   

    使用者来说没区别
    函数本身区别在于,str这个变量能不能再作赋值用,const的就不能在函数中=另一个值,也可以说没区别,区别在于const只是一个好习惯
      

  4.   

    是否可以把长串、短串理解为:长串即string类型的数据;
    短串是 type ShortStr = string[N]; N在1到255之间的任意一个值。
      

  5.   

    有了const,编译器不在进行保护性的工作
    好像有本书上说能提高好多效率
      

  6.   

    用CPU查看器分析一下编译后的机器指令(汇编)
    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参数不能再赋值效率和灵活性是取舍的问题通过管理帖子结贴。
      

  7.   

    function   IniStrToStr(const   Str:   string):   string; 
    function   IniStrToStr(Str:   string):   string;Const str:string 在函数体内其值是不可以写入的!
    Str:String; 反之