2016-06-08 5 views
8

मैं इस सी कोड में आए और मैं इसे समझने के लिए कोशिश कर रहा हूँ: इतना मैं समझता हूँसंरचनाओं को संरेखित करने से सी में कैसे मदद मिलती है?

typedef long Mtx_t[4][4]; 

typedef union { 
    Mtx_t m; 
    long long int force_structure_alignment; 
} Mtx; 

पहले typedef एक 4x4 मैट्रिक्स के रूप में Mtx_t परिभाषित करता है,। लेकिन एमटीएक्स के लिए दूसरा टाइपपीफ सिर्फ पिछले प्रकार की मांग करता है और फोर्स_स्ट्रक्चर_लिग्मेंट नामक एक लंबी लंबी int जोड़ता है।

इसका उद्देश्य क्या है? क्यों न सिर्फ एमटीएक्स को 4x4 मैट्रिक्स के रूप में परिभाषित करें और इसके साथ किया जाए?

+1

एक उत्सुक उदाहरण; चूंकि यह एक संघ है, आकार यह सबसे बड़ा प्रकार है; जो मेरे सिस्टम पर 'लंबे [4] [4] 'के लिए 128 बाइट्स होगा। जहां अन्य क्षेत्र मेरे सिस्टम पर केवल '8' बाइट्स है। यह किसी भी संरेखण में योगदान नहीं देता है। आप कल्पना करेंगे कि संरेखण के लिए उपयोग किए जाने के मामले में 'force_structure_alignment' अन्य प्रकारों से बड़ा होगा। – jacob

+2

वे इसे वैध 'लंबी लंबी' सीमा पर गठबंधन करने के लिए मजबूर कर रहे हैं। उदाहरण के लिए, यह 8 बाइट्स हो सकता है जबकि 'लंबा' 4 बाइट हो सकता है। यह स्पष्ट नहीं है कि यह वांछित क्यों है। यह स्मृति संदर्भ प्रदर्शन में सुधार करने का प्रयास हो सकता है। यह भी संभव है कि वे बड़ी स्मृति एक्सेस करने के लिए 'लंबे समय तक' के साथ 'Mtx_t' चर को उपनाम करने का प्रयास कर सकें। –

+1

@jacob: 'long [4] [4] 'में केवल' लंबी 'की संरेखण आवश्यकताएं हैं, इसलिए' लंबे समय तक संरेखण शायद कठोर है। – user2357112

उत्तर

4

नाम से स्पष्ट है, वे Mtx तों मजबूर करने के लिए कोशिश कर रहे हैं बल्कि एक long की तुलना में एक long long का पता संरेखण आवश्यकताओं के साथ स्मृति में रखा जा रहा,। ओएस या प्रोसेसर आर्किटेक्चर द्वारा लगाए गए आवश्यकताओं के लिए यह महत्वपूर्ण हो सकता है। Google सुझाव देता है कि "एमटीएक्स" शायद "म्यूटेक्स" के लिए छोटा है, और सी म्यूटेक्स कार्यान्वयन कुछ सुंदर निम्न-स्तरीय इंटरफेस से निपट रहा होगा।

+0

परमाणु मूल्यों के लिए एक उचित आवश्यकता एक अलग पीढ़ी के काउंटर (एबीए से बचने के लिए) रखना और डबल-शब्द तुलना-और-स्वैप का उपयोग करना है। इसलिए यदि आपको केवल दो आसन्न लेकिन अलग-अलग लम्बाई की आवश्यकता होती है, तो मशीन को उन्हें परमाणु संचालन के लिए आकार के दोगुनी पर गठबंधन करने की आवश्यकता हो सकती है। –

+0

मुझे लगता है कि एमटीएक्स निश्चित रूप से मैट्रिक्स है, बीकॉज़ [4] [4] एक मैट्रिक्स आकार बनाता है, और एमटीएक्स_टी में, 'टी' ट्रांसफॉर्मेशन मैट्रिक्स में 'रूपांतरण' के लिए खड़ा हो सकता है। – user3360203

+0

@ user3360203: "mtx_t" के लिए [Google परिणाम] (https://www.google.com/search?q=mtx_t) म्यूटेक्स के बारे में हैं, लेकिन [खोज को परिष्कृत करना] (https://www.google। com/search? q = mtx_t + force_structure_alignment) बताता है कि आप शायद "मैट्रिक्स" के बारे में सही हैं। यह भी सुझाव देता है कि शायद हमें इस कोड तक पहुंच नहीं है; ऐसा लगता है कि निंटेंडो 64 से मालिकाना कोड है। – user2357112

2

प्रोसेसर आर्किटेक्चर के साथ दक्षता के लिए किया जा सकता है। उदाहरण के लिए, यदि Mtx_t का आकार बाइट्स की एक विषम संख्या है और हार्डवेयर के निर्देश सेट/मेमोरी आर्किटेक्चर एक अजीब पते तक पहुंचने पर लागत लगाता है, तो आप यह सुनिश्चित करना चाहते हैं कि आपके सभी Mtx_t रिकॉर्ड पते के साथ बैठे हों जो सस्ता हैं पहुंच।

कंप्रेसर के साथ स्मृति के एक निश्चित आकार ब्लॉक के साथ काम करने की कुछ आवश्यकता हो सकती है। एक गद्दीदार संरचना का उपयोग करना इसे प्रबंधित करना आसान बना सकता है।

इसके बारे में यहाँ और अधिक पढ़ें: https://en.wikipedia.org/wiki/Data_structure_alignment

1

वहाँ चिप पढ़ने/लिखने के लिए डेटा वहन करती है, जिस पर डेटा बस है। तेजी से मेमोरी एक्सेस के लिए, इन बसों को कई बाइट्स में डेटा ले जाने के लिए डिज़ाइन किया गया है। 4/8/16 बाइट्स। लेकिन ये बस समान दक्षता वाले किसी भी मनमानी पते से डेटा नहीं पढ़/लिख सकती हैं। उदाहरण के लिए 8-बाइट डेटा बस 8-बाइट सीमा पर गठित स्मृति से डेटा पढ़ने/लिखने के लिए तेज़ी से होगी। यही कारण है कि उच्च दक्षता के लिए, बड़े आकार के डेटा/संरचना को गठबंधन करने की अनुशंसा की जाती है जैसे कि तेजी से पहुंच संभव हो। आपके उदाहरण में यह संरचना संरचनाओं के संकलक के कार्यान्वयन का शोषण करके किया जाता है जो इच्छा परिणाम उत्पन्न नहीं कर सकता है। लेकिन कंपाइलर को कीवर्ड का उपयोग करके एक चर के संरेखण के बारे में स्पष्ट रूप से बताया जा सकता है। जीसीसी 'संरेखित' कीवर्ड का उपयोग करता है

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

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