compiler construction - In C,the strings that have indentical content are always stored in identical memory? -
मुझे यह कोड मिला:
clock_t रिकॉर्ड [2] [15] ; Char * blockName [15]; Int count = 0; #define BEGIN (block_name) \ do {\ blockName [count] = #block_name; \ record [0] [count ++] = clock (); \} जबकि (0) \ #define अंत (block_name) \ करना {\ के लिए (आई इंट = 0; मैं & LT; गिनती; i ++) \ अगर (#block_name == blockName [i]) {\ रिकॉर्ड [1] [ आई] = घड़ी (); \ टूटना; \} \} जबकि (0) \ #define परिणाम \ करना {\ (i = 0 int i; मैं & LT; गिनती; i ++) \ printf ( "ब्लॉक% s लागत% च सेकंड \ n", blockName [i], \ (डबल) (रिकॉर्ड [1] [i] -रेकॉर्ड [0] [i]) / CLOCKS_PER_SEC); \} जबकि (0) \ जब हम कोड को -वॉल पर संकलित करते हैं, तो मुझे चेतावनी मिली:
चेतावनी: तुलना करें अनिर्दिष्ट व्यवहार में स्ट्रिंग का शाब्दिक परिणाम [-डैडर]
मुझे पता है कि समान सामग्री वाले स्ट्रिंग को समान स्मृति में संग्रहित किया जाता है। तो मैं लाइन लिख रहा हूं (#block_name = = ब्लॉकनाम [i]) दो स्ट्रिंग्स की तुलना करने के लिए लेकिन मुझे नहीं पता कि यह हमेशा मामला है।
क्या चेतावनी का मतलब है कि यह चाल सभी प्लेटफॉर्म पर काम नहीं करता है?
नहीं, यह वास्तव में संकलक पर निर्भर करता है कि समान स्ट्रिंग लीटरल एक बार संकलित (और इसलिए अपरिभाषित व्यवहार) एक ही पते पर इंगित करेगी। इसलिए एक साधारण पता तुलना आमतौर पर यह सुनिश्चित करने के लिए पर्याप्त नहीं है कि दो स्ट्रिंग समान हैं, भले ही दोनों एक ही स्रोत फाइल में हार्डकोड हो।
उदाहरण के लिए, Microsoft "स्ट्रिंग पूलिंग" कहता है और आपको विशेष रूप से अनुमति देता है इसे सक्षम या अक्षम करें।
एक उदाहरण के रूप में निम्नलिखित सरल कोड को लें:
const char * text1 = "हैलो वर्ल्ड!"; Const char * text2 = "हैलो वर्ल्ड!"; Printf ("हैलो वर्ल्ड!"); अनुकूलन के बिना, यह संभव है कि परिणामस्वरूप निष्पादन योग्य कोड "नमस्कार दुनिया" के तीन उदाहरणों तक शामिल हो सकता है। संकलक के आधार पर (और एमएसवीसी के मामले में क्या "स्ट्रिंग पूलिंग" सक्षम है या नहीं) आप अलग-अलग मेमोरी लेआउट के साथ समाप्त कर सकते हैं:
-
आकार के लिए अनुकूलित (और स्ट्रिंग पूलिंग सक्षम के साथ) :
(अन्य डेटा) हैलो वर्ल्ड! \ 0 (अन्य डेटा) -
आकार के लिए अनुकूलित नहीं (और / या स्ट्रिंग पूलिंग अक्षम के साथ):
(अन्य डेटा) हैलो वर्ल्ड! \ 0 हेलो वर्ल्ड! \ 0 हेलो वर्ल्ड! \ 0 (अन्य डेटा) < / Ul> बेशक वास्तविक लेआउट अभी भी थोड़ी भिन्न हो सकती है। वहाँ एक सलाह के रूप में अन्य स्मृति inbetween (भले ही यह सिर्फ गद्दी के लिए है) हो सकता है
सामान्य में। कभी नहीं, कभी, स्मृति संरेखण या स्मृति पते के बारे में कुछ भी मान लेते हैं, जब तक आप विशेष रूप से लेआउट को परिभाषित किया (जैसे कि struct के भाग के रूप में)।
आपकी वास्तविक कोड समस्या के लिए, मैं मानता हूं कि आप समय मापने के लिए कुछ आसान तरीका चाहते हैं? यदि हां, तो आप अपने मूल्यों को रन बनाने के लिए कॉन्टैटेनेशन ( timer ## block_name ) का उपयोग क्यों नहीं करते हैं?
Comments
Post a Comment