2010-12-01 13 views

उत्तर

32

इसका मतलब है कि जिस पते पर ध्यान दिया जा रहा है वह कुछ कारकों द्वारा समान रूप से विभाजित है।

कभी कभी शब्द "प्राकृतिक संरेखण" प्रयोग किया जाता है, जो आम तौर पर है कि प्राकृतिक संरेखण होने वस्तुओं पतों को समान रूप से वस्तु के आकार द्वारा divisble हैं पर रखा जा करने की जरूरत है का मतलब है।

संरेखण somestimes बहुत महत्वपूर्ण है, इस तरह के संरेखण पर कई हार्डवेयर से संबंधित बातें जगह प्रतिबंध के बाद से।

उदाहरण के लिए, क्लासिक SPARC आर्किटेक्चर (और शास्त्रीय ARM पर भी, मुझे लगता है), आप एक विषम पते से एक बाइट से अधिक पूर्णांक नहीं पढ़ सकते हैं। ऐसा करने का प्रयास करने से बस आपके प्रोग्राम को बस त्रुटि के साथ रोक दिया जाएगा। X86 आर्किटेक्चर पर, CPU हार्डवेयर समस्या को संभालता है (आवश्यकतानुसार कैश और/या मेमोरी के लिए एकाधिक एक्सेस करके), हालांकि इसमें अधिक समय लग सकता है। आरआईएससी: आईर आर्किटेक्चर आमतौर पर आपके लिए ऐसा नहीं करते हैं।

हालात इस तरह के भी गद्दी, अर्थात जैसे के बीच डमी डेटा की प्रविष्टि को प्रभावित कर सकते संरेखण बनाए रखने के लिए संरचना क्षेत्रों। इस तरह एक संरचना:

struct example 
{ 
    char initial; 
    double coolness; 
}; 

बहुत संभावना क्षेत्रों के बीच गद्दी के 7 बाइट्स होने अंत होता है, double क्षेत्र का अपना आकार से एक ऑफसेट विभाज्य पर संरेखित (जो मैं 8 माना गया है) बनाने के लिए ।

जब बाइनरी में देखा जाता है, पता n बाइट्स के अनुरूप अपने log2 (n) कम से कम-महत्वपूर्ण बिट शून्य पर सेट करना होगा। उदाहरण के लिए, 32-बाइट संरेखण की आवश्यकता वाले ऑब्जेक्ट में एक उचित-गठबंधन पता होगा जो कि (बाइनरी) 00000 के साथ समाप्त होता है, क्योंकि लॉग 2 (32) 5 है। यह भी दर्शाता है कि आवश्यक संख्या को साफ़ करके एक पते को संरेखण में मजबूर किया जा सकता है बिट्स का।

+0

@unwind: ओओसी, क्या आप किसी भी कार्यान्वयन के बारे में जानते हैं जो कारक * विषम * है? – SiegeX

+2

"एन बाइट्स से गठबंधन" को "2 से गठबंधन * बिट्स *" पढ़ना चाहिए, क्योंकि लॉग 2 (1) = 0. आपका मतलब है लॉग 2 (8) = 3. –

+0

@ एक्सेल: मैं इसका पालन नहीं करता ... हाँ, लॉग 2 (1) 0 है, 1 बाइट-संरेखण की आवश्यकता वाले किसी ऑब्जेक्ट को शून्य पर मजबूर किसी भी एलएसबी की आवश्यकता नहीं है। मैंने एक उदाहरण जोड़ा, मुझे उम्मीद है कि यह स्पष्ट हो जाएगा। क्या आपको अभी भी लगता है कि यह गलत है? – unwind

1

यह एक "गठबंधन" पते के लिए एक सूचक है। इस अर्थ में गठबंधन किया गया है कि पता कुछ मूल्यों का एक बहुमत है - आम तौर पर, किसी भी प्रकार की चीज का आकार यह (यदि एक आदिम प्रकार) पर इंगित करेगा, या कुछ डेटा सदस्य जिसके लिए इस संरेखण की आवश्यकता होती है।

आमतौर पर आपको इसके बारे में चिंता करने की ज़रूरत नहीं है; मेमोरी आवंटन फ़ंक्शंस यह सुनिश्चित करेगा कि वे जो मेमोरी आपको देते हैं वह ठीक से गठबंधन है। आप उस बिंदु पर संरेखण के बारे में चिंता करना शुरू करते हैं जहां आप पॉइंटर कास्ट के साथ असुरक्षित चीजें करना शुरू करते हैं।

2

संदर्भ पर निर्भर करता है, लेकिन यह या तो सूचक ही गठबंधन किया जा रहा है, या क्या यह गठबंधन है की ओर इशारा करता हो सकता है।

'संरेखित' का अर्थ है कि एक निश्चित वस्तु किसी पते पर संग्रहीत होती है जो एक निश्चित स्थिरता का एक बहु होता है। जैसे 32-बिट पूर्णांक के लिए यह लगभग हमेशा होता है 4. ऐसा इसलिए है क्योंकि बाइट 8-बिट्स: 4 * 8 = 32-बिट है। ऑब्जेक्ट एक गठबंधन पते पर संग्रहीत किया जाता है, या कुछ प्रोसेसर के लिए असाइन किए गए एक्सेस करने के लिए भी संभव नहीं है, तो अक्सर प्रोसेसर बहुत तेज मेमोरी एक्सेस कर सकता है।

3

क्या unwind में जोड़ने के लिए समझा रहा है, यहाँ एक struct मैं हाल ही में एक काम में प्रयोग किया जाता है:

struct infosale {    
    int noseq;     
    char salesman[30];   
    char product[11];   
    int count;     
};        

आप इस struct के आकार होने की उम्मीद कर सकते हैं (4 + 30 + 11 + 4 =) 49 बाइट्स, लेकिन वास्तव में यह 52sizeof की तुलना में है। (गठबंधन) क्योंकि noseq4 बाइट्स + salesman32 बाइट्स है + product12 बाइट (गठबंधन) और count4 बाइट्स, इस प्रकार 52 बाइट्स है।

+1

आपका गणित बंद है। साथ ही, मुझे किसी भी तरह संदेह है कि पैडिंग को विभाजित किया गया है, केवल अंतिम 'int' से पहले केवल 3 निरंतर बाइट पैडिंग जोड़ने के बजाय। – Deduplicator

+1

मैंने सीसीसी में जीसीसी (संस्करण को याद नहीं किया) के साथ इसका परीक्षण किया है, और उस समय डीबगर की रिपोर्ट यही है। मुझे पुष्टि करने के लिए इसकी समीक्षा करनी होगी। मुझे पूरा यकीन है कि, हालांकि, कंपाइलर को अजीब पते पसंद नहीं हैं और वेरिएबल्स को ऑफ़सेट में भी संरेखित करेंगे; इसलिए जब तक स्पष्ट रूप से निर्देश नहीं दिया जाता है तब तक यह पैड होगा। (यह थोड़ी देर हो गया है क्योंकि मैंने सी में कोड किया था!) –

+1

अस्पष्ट होने के लिए सूखी: आपका पहला योग 49 नहीं 48 है, और मुझे यह जानने में दिलचस्पी होगी कि आपने किस कंपाइलर का परीक्षण किया था जिस पर चार सरणी को int की तरह गठबंधन किया गया था। – Deduplicator

0

जैसा कि लोगों ने मेरे सामने उल्लेख किया है इसका मतलब है कि आपका सूचक बाइट्स की एक निश्चित संख्या द्वारा समान रूप से विभाजित है।

यह जांचने के लिए अपने सूचक गठबंधन है आप यह कर सकते हैं:

isaligned = !((long)pointer % bytes); 

अब, "isaligned" सच है, तो "सूचक" "बाइट" बाइट के अनुरूप किया जाता है।

+0

असल में, आप नहीं कर सकते, और आपका कंपाइलर आपको बताएगा। आप 'bool isAligned = (reinterpret_cast (सूचक)% sizeof (* सूचक)) == 0); '। – MSalters

+0

हाँ, यह सही है। आप पॉइंटर्स पर मॉड्यूलो नहीं कर सकते हैं, इसलिए आपको इसे और अधिक उचित तरीके से डालना होगा। मेरे द्वारा ठीक कर दिया जाएगा! – onemasse

0

निरपेक्ष सूचक मतलब है कि एक एक निरंतर और उसके गुणकों

char a[5] = "12345";

यहाँ

a के लिए जोड़कर पहुँचा जा सकता है आसन्न स्मृति स्थान के साथ कि सूचक लगातार सूचक है यदि आप और यह हर के लिए चार का आकार बार जब आप अगले chracter है कि,

a + sizeofchar का उपयोग करेंगे उपयोग कर सकते हैं 2

a + (sizeofchar * 2) 3 पर

तक पहुंच जाएगा, इसी तरह यदि आप बिट मानों द्वारा विविध बिट तक पहुंचते हैं।

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