2015-10-04 3 views
5

के लिए मैं इस तरह एक कोड है। लेकिन उपरोक्त फ़ंक्शन वेरिएबल, आर, एस, और परिणाम के लिए 3 अलग-अलग पते प्रिंट करता है। तो यह भ्रमित है .. क्या स्मृति में 'हैलो' स्ट्रिंग की केवल एक प्रति है?डेल्फी कॉपी-ऑन-राइट स्ट्रिंग

उत्तर

9

जब भी आप एक स्ट्रिंग के तत्व का पता लेते हैं, तो के रूप में गणना करता है संकलक की आंखों में लिखें। जहां तक ​​यह चिंतित है, अब आपके पास स्ट्रिंग के आंतरिक भाग में कच्चा सूचक है, और कौन जानता है कि आप इसके साथ क्या करने की योजना बना रहे हैं। तो, इसके परिप्रेक्ष्य से, यह सुरक्षित खेलता है। यह स्ट्रिंग की एक अनूठी प्रतिलिपि बनाने का निर्णय लेता है, ताकि आप अपने कच्चे सूचक के साथ जो कुछ भी काम करने की योजना बना रहे हों, वह करने के लिए स्वतंत्र हो।

कोड आपके पास यह करने के लिए संकलित:

 
Project2.dpr.13: r := 'Hello'; 
00419EF8 8D45FC   lea eax,[ebp-$04] 
00419EFB BAA89F4100  mov edx,$00419fa8 
00419F00 E827D2FEFF  call @UStrLAsg 
Project2.dpr.14: Writeln(NativeInt(PChar(@r[1]))); 
00419F05 8D45FC   lea eax,[ebp-$04] 
00419F08 E883D3FEFF  call @UniqueStringU 
00419F0D 8BD0    mov edx,eax 
00419F0F A18CE64100  mov eax,[$0041e68c] 
00419F14 E853B2FEFF  call @Write0Long 
00419F19 E82EB5FEFF  call @WriteLn 
00419F1E E845A1FEFF  call @_IOTest 
Project2.dpr.15: s := r; 
00419F23 8D45F8   lea eax,[ebp-$08] 
00419F26 8B55FC   mov edx,[ebp-$04] 
00419F29 E8FED1FEFF  call @UStrLAsg 
Project2.dpr.16: Writeln(NativeInt(PChar(@s[1]))); 
00419F2E 8D45F8   lea eax,[ebp-$08] 
00419F31 E85AD3FEFF  call @UniqueStringU 
00419F36 8BD0    mov edx,eax 
00419F38 A18CE64100  mov eax,[$0041e68c] 
00419F3D E82AB2FEFF  call @Write0Long 
00419F42 E805B5FEFF  call @WriteLn 
00419F47 E81CA1FEFF  call @_IOTest 
Project2.dpr.17: Result := r; 
00419F4C 8BC3    mov eax,ebx 
00419F4E 8B55FC   mov edx,[ebp-$04] 
00419F51 E88ED1FEFF  call @UStrAsg 
Project2.dpr.18: Writeln(NativeInt(PChar(@Result[1]))); 
00419F56 8BC3    mov eax,ebx 
00419F58 E833D3FEFF  call @UniqueStringU 
00419F5D 8BD0    mov edx,eax 
00419F5F A18CE64100  mov eax,[$0041e68c] 
00419F64 E803B2FEFF  call @Write0Long 
00419F69 E8DEB4FEFF  call @WriteLn 
00419F6E E8F5A0FEFF  call @_IOTest 

UniqueStringU के लिए कॉल प्रति-ऑन-राइट में नकल कर रहे हैं।

+0

तो अनन्यस्ट्रिंगयू स्ट्रिंग की सामग्री की प्रतिलिपि बनायेगा? तो स्मृति में 'हैलो' की 3 प्रतियां होंगी, क्या मैं सही हूँ? –

+0

असल में 4 होगा। निरंतर एक स्मृति को पढ़ने में, और तीन प्रतियां। –

+0

बस स्पष्ट होने के लिए, अगर मैंने उदाहरण कोड में 3 लेखों के बयान हटा दिए हैं, तो बस s: = r; परिणाम: = r; स्ट्रिंग की केवल 1 प्रति होगी? –