2011-10-11 13 views
6

मुझे यह ध्यान रखना था कि सी ++ (वीएसवीसी ++ 2008 विशेष रूप से) मुझे एक विधि में एक संरचना इनलाइन घोषित करने देता है। उदाहरण के लिए:इनलाइन स्ट्रक्चर घोषणा

MyClass::method() 
{ 
struct test{ int x;}; 
test t = {99}; 
} 

मेरा प्रश्न है, कैसे इस घोषणा काम आंतरिक रूप से, और विशेष रूप से यह किसी भी नकारात्मक प्रदर्शन निहितार्थ है करता है?

+0

[सी ++ फ़ंक्शन में स्थानीय वर्ग के उपयोग के संभावित डुप्लिकेट] (http://stackoverflow.com/questions/5714616/usage-of-local-class-in-c-function) – Nawaz

+0

इसे स्थानीय श्रेणी कहा जाता है। इसके बारे में अधिक जानने के लिए [संभावित डुप्लिकेट] (http://stackoverflow.com/questions/5714616/usage-of-local-class-in-c- कार्यक्षमता)। – Nawaz

उत्तर

6

यह घोषणा आंतरिक रूप से कैसे काम करती है?

बिल्कुल नामस्थान स्कोप पर एक घोषणा की तरह, सिवाय इसके कि नाम केवल ब्लॉक के दायरे में दिखाई देता है (इस मामले में, फ़ंक्शन बॉडी)। अद्यतन: जैसा कि @ नवाज बताते हैं, स्थानीय वर्गों पर लागू होने वाले एक या दो अतिरिक्त प्रतिबंध हैं: उनके पास स्थैतिक डेटा सदस्य नहीं हो सकते हैं, और (सी ++ 03 में, लेकिन सी ++ 11 नहीं) उनका उपयोग नहीं किया जा सकता है टेम्पलेट प्रकार तर्क।

क्या इसका कोई नकारात्मक प्रदर्शन प्रभाव पड़ता है?

नहीं, इसके दायरे के अलावा (जो केवल कोड संकलित करता है या नहीं), यह किसी अन्य वर्ग परिभाषा के समान है।

+2

बिल्कुल सही जवाब नहीं है। स्थानीय वर्गों और नामस्थान-वर्गों के बीच बहुत अंतर हैं। संभावित डुप्लिकेट देखें: http: //stackoverflow.com/questions/5714616/usage-of-local-class-in-c-function – Nawaz

+0

@ नवाज़: धन्यवाद, मैंने थोड़ी अधिक वृद्धि की है, और मुझे वास्तव में पता नहीं था कि वे स्थिर डेटा सदस्य नहीं हो सका। मुझे लगता है कि जवाब अब और सही है। –

0

यदि आपको लगता है कि एक समारोह में struct घोषणा प्रत्येक कॉल के बाद नकारात्मक लागत बनाती है और सीपीयू समय लेती है, तो आप गलत हैं। कंपाइलर इसे संकलित समय में संभालता है और ऐसा लगता है कि आप फ़ंक्शन (लेकिन सीमित स्कोप) से struct घोषित करते हैं।

2

फ़ंक्शन स्कोप के अंदर या उसके बाहर के प्रकार को परिभाषित करने से मुख्य अंतर, ठीक है, दायरा है। यही है, अगर इसे फ़ंक्शन के अंदर परिभाषित किया गया है तो यह फ़ंक्शन के बाहर पहुंच योग्य नहीं होगा।

हालांकि अन्य अंतर हैं (कम से कम सी ++ 03 में, मैंने सी ++ 11 को फिर से जांच नहीं किया है), आपके पास स्थानीय वर्ग में स्थिर सदस्य या टेम्पलेट सदस्य नहीं हो सकता है। आप उस स्थानीय वर्ग को टेम्पलेट के लिए तर्क के रूप में उपयोग नहीं कर सकते हैं (यह सीमा सी ++ 11 में हटा दी गई है), और आईआईआरसी ऐसा इसलिए है क्योंकि स्थानीय वर्ग में आंतरिक संबंध है (नामस्थान स्तर वर्ग के लिए बाहरी के बजाय), और आवश्यक टेम्पलेट्स बाहरी संबंध होने के लिए तर्क।

संबंधित मुद्दे