在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
技术交流,DH讲解. 这个是在CSDN上面看见的问题.我说说自己的想法. procedure TForm1.btn1Click(Sender: TObject); var Str:String; begin Str:='abc' ; Str:=str+'d'; str:=copy(Str,1,3); str:=UpperCase(str); end; 问题1答案:2010下
但是abc 和 d 那两个字符串是编译的时候就被Delphi给写进去了,也就是编译期产生的,不是运行的时候产生的.运行时候产生的字符串就只有3个 procedure TForm1.btn1Click(Sender: TObject); var Str:String; begin Str:='abc'+'d'+'f' ; end; 问题2答案: Unit4.pas.29: begin 005144E0 55 push ebp 005144E1 8BEC mov ebp,esp 005144E3 6A00 push $00 005144E5 33C0 xor eax,eax 005144E7 55 push ebp 005144E8 6816455100 push $00514516 005144ED 64FF30 push dword ptr fs:[eax] 005144F0 648920 mov fs:[eax],esp Unit4.pas.30: Str:='abc'+'d'+'f' ; 005144F3 8D45FC lea eax,[ebp-$04] 005144F6 BA2C455100 mov edx,$0051452c //Delphi编译器直接生成了abcdf字符串对象 005144FB E8E831EFFF call @UStrLAsg Unit4.pas.31: end; 00514500 33C0 xor eax,eax 00514502 5A pop edx 00514503 59 pop ecx 00514504 59 pop ecx 00514505 648910 mov fs:[eax],edx 00514508 681D455100 push $0051451d 0051450D 8D45FC lea eax,[ebp-$04] 00514510 E86F31EFFF call @UStrClr 00514515 C3 ret 答案就是0个了,abcdf是编译时候产生的,运行的时候只是把str指向这个编译时候就有了的内存. procedure TForm1.btn1Click(Sender: TObject); var Str,Str1:String; begin Str:='abc' ; Str1:='abc'; if (Str=Str1) then ShowMessage('相同') else ShowMessage('不相同') end; 问题3答案: Unit4.pas.30: Str:='abc' ; 00523AF5 8D45FC lea eax,[ebp-$04] 00523AF8 BA643B5200 mov edx,$00523b64 00523AFD E8263CEEFF call @UStrLAsg Unit4.pas.31: Str1:='abc'; 00523B02 8D45F8 lea eax,[ebp-$08] 00523B05 BA643B5200 mov edx,$00523b64 00523B0A E8193CEEFF call @UStrLAsg Unit4.pas.32: if (Str=Str1) then 00523B0F 8B45FC mov eax,[ebp-$04] 00523B12 8B55F8 mov edx,[ebp-$08] //2个局部变量都指向同一个内存地址,但是比较的时候用的是UStrEqual函数,所以还得看这个函数是怎么比较的 00523B15 E8A242EEFF call @UStrEqual //这个函数一进来是直接比较指针地址,也就是相等的了,就返回了 00523B1A 750C jnz $00523b28 Unit4.pas.33: ShowMessage('相同') 00523B1C B8783B5200 mov eax,$00523b78 00523B21 E80A4EFBFF call ShowMessage 00523B26 EB0A jmp $00523b32 Unit4.pas.35: ShowMessage('不相同') 00523B28 B88C3B5200 mov eax,$00523b8c 00523B2D E8FE4DFBFF call ShowMessage Unit4.pas.36: end; 00523B32 33C0 xor eax,eax 从上面看出来,直接是对栈上面2个变量 指向地址进行比较的. |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论