2013-02-20 69 views
5

यह सी और सी ++ दोनों के लिए एक सैद्धांतिक प्रश्न है।क्या सी/सी ++ में स्वचालित चर के आवंटन क्षेत्र को बदलना संभव है?

मैं एक 4x4 मैट्रिक्स प्रकार जो काफी बस के रूप में परिभाषित किया गया है है:

typedef float Matrix44[16]; 

मैं भी कई तरीके हैं जो एक पैरामीटर के रूप में एक Matrix44 ले, उदाहरण के लिए:

bool matrixIsIdentity(Matrix44 m); 

मैं भी है एक कस्टम मेमोरी आवंटन योजना जहां जगह मेमोरी का एक बड़ा क्षेत्र ढेर पर पूर्व-आवंटित किया जाता है और फिर मैं उस पूर्वनिर्धारित स्मृति पर मैन्युअल रूप से आवंटन प्रबंधित करता हूं। इस तरह मैंने अपने स्वयं के कार्यान्वयन के साथ malloc/new को प्रतिस्थापित/ओवरलोड किया है। समस्या यह है कि कस्टम malloc और new दोनों प्रकृति द्वारा, एक वस्तु वापस नहीं, एक सूचक वापस लौटें।

आमतौर पर, मैं बस निम्नलिखित करना होगा:

// Method 1 
1] Matrix44 mat = { ... }; 
2] bool res = matrixIsIdentity(mat); 

हालांकि, लाइन 1 स्टैक पर mat आवंटित, अपने कस्टम स्मृति क्षेत्र में नहीं के रूप में मैं चाहता हूँ जाएगा। एक विकल्प है:

// Method 2 
1] Matrix44 *mmat = myMalloc(...); 
1a] Matrix44 *nmat = new ... 
2] bool res = matrixIsIdentity(*mat); 

यहां मुद्दा यह है कि मुझे अपने कोड को ड्रेफरेंस ऑपरेटरों के साथ कूड़े रखना होगा। अब एक विकल्प Matrix44* लेने के लिए सभी विधियों को फिर से लिखना होगा, लेकिन, क्योंकि यह सैद्धांतिक है, मुझे लगता है कि यह एक विकल्प नहीं है।

इसलिए मेरा प्रश्न बन जाता है: क्या Method 1 Line 1 में स्वचालित रूप से सी और/या सी ++ में स्वचालित चर घोषित करने का कोई तरीका है, लेकिन क्या यह वैकल्पिक आवंटन योजना (Method 2 Line 1 में) का पालन करता है?

(मैं इस संकलक से संबंधित चर्चा शामिल हो सकता है की सराहना करते हैं, लेकिन मुझे लगता है कि प्रभाव में नहीं जोड़ा है टैग)

+2

कृपया इसे गलत तरीके से न लें, लेकिन मुझे यकीन है कि यह संभव नहीं है। यदि यह एक सूचक की तरह नहीं दिखता है, तो यह एक सूचक की तरह व्यवहार नहीं करना चाहिए। बेशक, सी ++ चीजों में हमेशा इतना स्पष्ट नहीं होता है, हे। – unwind

+0

मुझे लगता है कि यह सबसे पहले, आप जिस ओएस का उपयोग कर रहे हैं उस पर निर्भर करता है। मुझे लगता है कि मेमोरी लेआउट को पुनर्व्यवस्थित करने के लिए आप लिंकर के साथ परेशान हो सकते हैं। लेकिन मैं सुनिश्चित होने से बहुत दूर हूं ... –

+2

आपको वास्तव में पैरामीटर के रूप में 'Matrix44' नहीं लेना चाहिए; ये बहुत कीमती है। ऐसे पैरामीटर को 'कॉन्स मैट्रिक्स 44' के बजाय घोषित करें। क्या यह शायद पहले स्थान पर ढेर पर मैट्रिस आवंटित करने की आपकी इच्छा को कम करेगा? –

उत्तर

4

यह संभव नहीं है, स्वत: चर आधारित ढेर कर रहे हैं। लेकिन आप कन्स्ट्रक्टर के अंदर जो चाहें कर सकते हैं। तो मैट्रिक्स 44 आईएमपीएल, जो आपके "कस्टम" मेमोरी को इंगित करेगा, आपके मैट्रिक्स 44 बस एक पतली रैपर होगी।

+0

असल में वे आवंटित किए गए हैं I एन स्वचालित भंडारण जो भी हो सकता है, लेकिन हां, ज्यादातर बार ढेर है। – sharptooth

+0

@ शार्पतोथ, मैं उत्सुक हूं कि * अधिकांश समय * से आता है क्योंकि इसका तात्पर्य है कि कुछ ऐसे उदाहरण हैं जिनमें ढेर का उपयोग नहीं किया जाता है। क्या आप एक कंपाइलर के बारे में जानते हैं जो इसे लागू करने के लिए ढेर का उपयोग नहीं करता है? – thang

+1

@thang यह "ढेर" की आपकी परिभाषा पर निर्भर करता है। सी ++ मानक को कम या कम * ए * स्टैक पर आवंटित स्वचालित चर की आवश्यकता होती है, लेकिन सभी हार्डवेयर में हार्डवेयर स्टैक नहीं होता है, और बहुत से लोग दोनों को भ्रमित करते हैं। –

2

खैर, यह नहीं 100% ठीक है क्या आप के लिए पूछ सकते हैं, लेकिन एक संदर्भ का उपयोग कर तरह दिखेगा आप क्या चाहते हैं, और कम या ज्यादा अप्रभेद्य से आप क्या चाहते हैं व्यवहार करते हैं अगर मैं सही ढंग से समझ:

Matrix44& mmat = *new Matrix44(...); // or *myMalloc() or whatever 

mmat.Rotate(45.0); 
bool res = matrixIsIdentity(mat); 
... 
delete &mmat; // or myFree(&mmat) or something similar 

new पर ड्रेफरेंस और delete पर ऑपरेटर का पता, जो स्वीकार्य रूप से थोड़ा क्विकर है, लेकिन मुझे नहीं लगता कि यह वाक्य रचनात्मक रूप से/अर्थात् गलत क्यों होगा। संकलक इसे ठीक से स्वीकार करता है, और यह "काम करता है"।

मैं दृढ़ता से ऐसी चीज करने के खिलाफ सलाह दूंगा। भले ही यह पूरी तरह से "काम करता है", यह भ्रामक है। कोड यह देखना चाहिए कि यह क्या कर रहा है, और ऐसा करना चाहिए जो ऐसा दिखता है। यह कोड नहीं है।

कुछ ऐसा तरह लग रहा है यह ढेर पर रहता है की आवश्यकता नहीं किया जाना चाहिए (या, यहां तक ​​कि संभव!) delete को सौंप दिया, और यकीनन कोड है कि कुछ समलैंगिक करता है वास्तव में नहीं "काम" करता है यहां तक ​​कि इसे अगर " ठीक काम करता है"।