यह सी और सी ++ दोनों के लिए एक सैद्धांतिक प्रश्न है।क्या सी/सी ++ में स्वचालित चर के आवंटन क्षेत्र को बदलना संभव है?
मैं एक 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
में) का पालन करता है?
(मैं इस संकलक से संबंधित चर्चा शामिल हो सकता है की सराहना करते हैं, लेकिन मुझे लगता है कि प्रभाव में नहीं जोड़ा है टैग)
कृपया इसे गलत तरीके से न लें, लेकिन मुझे यकीन है कि यह संभव नहीं है। यदि यह एक सूचक की तरह नहीं दिखता है, तो यह एक सूचक की तरह व्यवहार नहीं करना चाहिए। बेशक, सी ++ चीजों में हमेशा इतना स्पष्ट नहीं होता है, हे। – unwind
मुझे लगता है कि यह सबसे पहले, आप जिस ओएस का उपयोग कर रहे हैं उस पर निर्भर करता है। मुझे लगता है कि मेमोरी लेआउट को पुनर्व्यवस्थित करने के लिए आप लिंकर के साथ परेशान हो सकते हैं। लेकिन मैं सुनिश्चित होने से बहुत दूर हूं ... –
आपको वास्तव में पैरामीटर के रूप में 'Matrix44' नहीं लेना चाहिए; ये बहुत कीमती है। ऐसे पैरामीटर को 'कॉन्स मैट्रिक्स 44' के बजाय घोषित करें। क्या यह शायद पहले स्थान पर ढेर पर मैट्रिस आवंटित करने की आपकी इच्छा को कम करेगा? –