本帖最后由 liangpei2008 于 2010-01-31 22:06:44 编辑

解决方案 »

  1.   

    本帖最后由 liangpei2008 于 2010-02-03 07:16:24 编辑
      

  2.   

    up一下,对string机制一片空白
      

  3.   

    up一下,对string机制一片空白
      

  4.   

    顺便再解释一下反复string累计会提早出现内存不足的原因(虽然空余内存是足够的)
      

  5.   

    问题1:创建了4次(under d6)
    procedure TForm1.btn1Click(Sender: TObject);
    var
      Str:String;
    begin
      Str:='abc' ;//这里算一个
       
      Str:=str+'d';//调用lstrcat--->NewAnsiString,即新对象
     
      str:=copy(Str,1,3);//调用lstrCopy--->NewAnsiString即新对象
     
      str:=UpperCase(str);//最终也调用了NewAnsiString 即新对象
    end;
    观察Cpu View,得此结论
      

  6.   

    问题2,只创建一个对象,也是观察cpu view
    var
      Str:String;
    begin
      Str:='abc'+'d'+'f' ;
    end;
    'abc'+'d'+'f'作为立即数处理
      

  7.   

    问题3,比较的是字串内容,调用了lStrCmp
    var
      Str,Str1:String;
    begin
      Str:='abc'  ;
      Str1:='abc';
      if (Str=Str1) then//在Delphi中,"="就是Java中的"=="
      ShowMessage('相同')
      else
      ShowMessage('不相同') 
      

  8.   

    问题4:
    procedure TForm1.btn1Click(Sender: TObject);
    var
      Str,Str1  :String;
    begin
      Str:='abc'  ;
      Str1:=Str+'d';//由于Str+'d'会执行lstrCat,这里也会再创建,所以这里共有2个
    end;procedure TForm1.btn2Click(Sender: TObject);
    const
      str='abc'; //const字串,作为常量,应该是放在数据区中,直接访问。查cpu view,是直接访问地址。
    var
      str1:string;
    begin
      Str1:=Str+'d';//所以这里只会有一个
    end;
    问题5,就不用回答了吧
    以上 个人理解,不足之处,欢迎指正。
      

  9.   

    哈哈!
    老兄可能没看清题意,是过程被调用时产生几个String对象!
    答案应该是3!
    因为str:='abc',编译期就已经创建了
      

  10.   

    问题1:创建了4次(under d6) 
    procedure TForm1.btn1Click(Sender: TObject); 
    var 
      Str:String; 
    begin 
      Str:='abc' ;//这里算一个   Str:=str+'d';//调用lstrcat--->NewAnsiString,即新对象   str:=copy(Str,1,3);//调用lstrCopy--->NewAnsiString即新对象   str:=UpperCase(str);//最终也调用了NewAnsiString 即新对象 
    end; 
    观察Cpu View,得此结论 
      

  11.   

    这个没错!
    一般的对象引用之间对比是比较对象引用地址(cmp dx,ax //dx与ax分别放有对象引用的地址),而String这个类的实例相比,比的却是内容(call @LstrTmp)!
      

  12.   

    嗯,确实,这个观察cpu view,只是将指针指向'abc'所在,并没有new。^_^!
      

  13.   

    我发现对java的了解太少了,这点代码都看不懂,学习ing.
      

  14.   


    问题是delphi的 不是java的   
      

  15.   

    厉害啊,请问有没有通用的比较Record的办法,只要能判断是string和简单类型就可以了.
      

  16.   


    我没学过JAVA就学过C++也能看的懂啊
      

  17.   

    晕,竟然成散分贴了,就人家Avan_Lau参与了一下......
      

  18.   

    哈哈,那就請博士總結一下,散分吧。
    我先拋磚引玉:
    1、在例程中,常量或常量字串賦給字串變量時,不會新建一個字串對象;常量或常量字串,在編譯後,就已經固定放在數據區了。所以以下的代碼執行過程是一樣的:procedure TForm1.btn1Click(Sender: TObject);
    var
      Str:String;
    begin
      Str:='abc'+'d'+'f' ;
    end;
    var
      Str:String;
    begin
      Str:='abc' ;
    const
      str='abc';
    var
      str1:string;
    begin
      Str1:=Str;2、字串對象的產生依賴于 copy-on-write 寫復制,當字串內容發生變化時,則會新產生一個字串對象,原來的字串因引用計數減少為0而釋放(字串常量除外)。正如在CPU VIEW中所看到的執行狀況:字串連接、copy、大小寫變化等等,都會執行到newAnsiString(這個例程的調用與版本有關,如D2009可能是另一個)
      

  19.   

    Avan_Lau 的答案是正确的 我的答案跟他的一样
      

  20.   

    从我踏入CSDN开始时候就有人讨论这个,时间过的很快。
      

  21.   

    到时我跟着学习.  
    var
      Str:String;
    begin
      Str:='abc' ;这个别总结错了. 
      

  22.   

    那样的话,以后如果编译器再改进,又都优化了,就没有动态生成的String了。