static
वैरिएबल किसी भी फ़ंक्शन से पहले उसी अनुवाद इकाई (सीपीपी फ़ाइल को कम या कम) में पूरी तरह से प्रारंभ किया जाता है। main
से पहले उन्हें प्रारंभ करने की गारंटी नहीं है, यदि main
एक अलग अनुवाद इकाई में है। inline
फ़ंक्शंस डुप्लिकेट किए गए हैं, जहां प्रत्येक अनुवाद इकाई की अपनी प्रति होती है। इसका मतलब है कि static
वैरिएबल की तुलना में विभिन्न अनुवाद इकाइयों में इनलाइन फ़ंक्शंस उस चर को पढ़ने/लिखने का प्रयास कर सकते हैं, ठीक से शुरू होने से पहले, जिसके परिणामस्वरूप अपरिभाषित व्यवहार होता है। (नियम बहुत जटिल हैं, लेकिन मुझे याद है)
§ 3.6.2/4 यह कार्यान्वयन-परिभाषित किया गया है कि स्थिर भंडारण अवधि के साथ गैर-स्थानीय चर के गतिशील प्रारंभिक पहले विवरण से पहले किया जाता है या नहीं मुख्य का यदि प्रारंभिकरण मुख्य के पहले कथन के बाद कुछ बिंदु पर स्थगित कर दिया गया है, तो यह वैरिएबल के रूप में उसी अनुवाद इकाई में परिभाषित किसी भी फ़ंक्शन या चर के पहले ओडीआर-उपयोग (3.2) से पहले होगा।
और
§ 3.2/3 एक इनलाइन समारोह हर अनुवाद इकाई है जिसमें यह ओडीआर से इस्तेमाल किया है के रूप में परिभाषित किया जाएगा।
इनलाइन फ़ंक्शंस वास्तव में गैर-इनलाइन फ़ंक्शंस की तुलना में कहीं अधिक खतरनाक नहीं हैं, जहां तक मुझे पता है। किसी भिन्न टीयू में स्थैतिक तक पहुंचने वाला कोई भी कार्य जोखिम भरा होता है, और inline
से प्रत्येक टीयू में फ़ंक्शंस डालने का होता है, उनमें से अधिकतर सुरक्षित नहीं हैं। एक कामकाज "construct on first use idiom" का उपयोग करना है।
अंतर्निहित टेम्पलेट विशेषज्ञताओं जटिल हैं, लेकिन पूर्णता के लिए:
§ 14.7.1/3 [temp.inst] एक स्थिर डेटा सदस्य का प्रारंभ (और कोई भी संबद्ध दुष्प्रभाव) जब तक नहीं होती है स्थैतिक डेटा सदस्य स्वयं इस तरह से उपयोग किया जाता है जिसके लिए स्थैतिक डेटा सदस्य की परिभाषा की आवश्यकता होती है।
तो टेम्पलेट कक्षाओं के स्थिर सदस्य हमेशा उपयोग से पहले प्रारंभ किए जाते हैं।
उपर्युक्त सभी the static initialization order fiasco के अधीन है), जो उपरोक्त "पहले उपयोग मूर्ति पर निर्माण" हल करता है।
स्रोत
2013-03-05 21:39:46
मैंने पहले कभी इसके बारे में सोचा नहीं, लेकिन हाँ, यह एक समस्या है? –
कौन सा अकसर किये गए सवाल है? – Slava
आमतौर पर "सी ++ एफएक्यू" [[]: http: // http: //www.parashift.com) को संदर्भित करता है, लेकिन [16.4 उस साइट पर इनलाइन या स्थैतिक से कोई लेना देना नहीं है] (http: // www। parashift.com/c++-faq/new-vs-malloc.html), इसलिए मुझे इस मामले में निश्चित नहीं है। मुझे इस साइट पर उल्लिखित इस मुद्दे पर उल्लिखित समस्या नहीं मिल रही है। –