问题2,只创建一个对象,也是观察cpu view var Str:String; begin Str:='abc'+'d'+'f' ; end; 'abc'+'d'+'f'作为立即数处理
问题3,比较的是字串内容,调用了lStrCmp var Str,Str1:String; begin Str:='abc' ; Str1:='abc'; if (Str=Str1) then//在Delphi中,"="就是Java中的"==" ShowMessage('相同') else ShowMessage('不相同')
问题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,就不用回答了吧 以上 个人理解,不足之处,欢迎指正。
哈哈,那就請博士總結一下,散分吧。 我先拋磚引玉: 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可能是另一個)
Avan_Lau 的答案是正确的 我的答案跟他的一样
从我踏入CSDN开始时候就有人讨论这个,时间过的很快。
到时我跟着学习. var Str:String; begin Str:='abc' ;这个别总结错了.
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,得此结论
var
Str:String;
begin
Str:='abc'+'d'+'f' ;
end;
'abc'+'d'+'f'作为立即数处理
var
Str,Str1:String;
begin
Str:='abc' ;
Str1:='abc';
if (Str=Str1) then//在Delphi中,"="就是Java中的"=="
ShowMessage('相同')
else
ShowMessage('不相同')
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,就不用回答了吧
以上 个人理解,不足之处,欢迎指正。
老兄可能没看清题意,是过程被调用时产生几个String对象!
答案应该是3!
因为str:='abc',编译期就已经创建了
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,得此结论
一般的对象引用之间对比是比较对象引用地址(cmp dx,ax //dx与ax分别放有对象引用的地址),而String这个类的实例相比,比的却是内容(call @LstrTmp)!
问题是delphi的 不是java的
我没学过JAVA就学过C++也能看的懂啊
我先拋磚引玉:
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可能是另一個)
var
Str:String;
begin
Str:='abc' ;这个别总结错了.