2012-04-25 10 views
6

के सबसे बड़े संरेखण का एक बहुतायत क्यों होना चाहिए, मैं व्यक्तिगत प्रकार के सही संरेखण सुनिश्चित करने के लिए संरचना के सदस्यों के बीच होने वाली पैडिंग को समझता हूं। हालांकि, डेटा संरचना को सबसे बड़े सदस्य के संरेखण के बहुमत क्यों होना चाहिए? मुझे समझ में नहीं आता कि अंत में पैडिंग की आवश्यकता है।संरचना के आकार को किसी भी संरचना सदस्य

संदर्भ: http://en.wikipedia.org/wiki/Data_structure_alignment

उत्तर

7

अच्छा सवाल। इस काल्पनिक प्रकार पर विचार करें:

struct A { 
    int n; 
    bool flag; 
}; 

तो, प्रकार A का एक उद्देश्य पांच बाइट (पूर्णांक के लिए चार से अधिक bool के लिए एक) ले जाना चाहिए, लेकिन वास्तव में यह आठ लेता है। क्यूं कर?

जवाब अगर आप इस तरह प्रकार का उपयोग देखा जाता है:

const size_t N = 100; 
A a[N]; 

तो प्रत्येक A केवल पांच बाइट्स थे, तो a[0] संरेखित होगा, लेकिन a[1], a[2] और अन्य तत्वों का सबसे नहीं होगा।

लेकिन संरेखण क्यों मायने रखता है? सभी हार्डवेयर-संबंधित कई कारण हैं। एक कारण यह है कि सीपीयू सिलिकॉन पर तेजी से पहुंच के लिए हाल ही में/अक्सर उपयोग की गई मेमोरी कैश लाइन में कैश की जाती है। एक कैश लाइन से छोटा एक गठबंधन ऑब्जेक्ट हमेशा एक पंक्ति में फिट बैठता है (लेकिन नीचे दी गई रोचक टिप्पणियां देखें), लेकिन एक असाइन किए गए ऑब्जेक्ट कैश को बर्बाद कर दो लाइनों को बाधित कर सकता है।

वास्तव में और भी मौलिक हार्डवेयर कारण हैं, जिस तरह से बाइट-एड्रेसेबल डेटा को 32- या 64-बिट डेटा बस को स्थानांतरित किया जाता है, कैश लाइनों के अलावा। न केवल गलत तरीके से अतिरिक्त fetches के साथ बस को छेड़छाड़ (केवल straddling के रूप में पहले), लेकिन यह रजिस्टरों को बाइट्स को स्थानांतरित करने के लिए बाध्य करने के लिए भी मजबूर करेगा। इससे भी बदतर, misalignment ऑप्टिमाइज़ेशन तर्क को भ्रमित करने के लिए प्रेरित करता है (कम से कम, इंटेल के अनुकूलन मैनुअल का कहना है कि यह करता है, हालांकि मुझे इस अंतिम बिंदु का कोई व्यक्तिगत ज्ञान नहीं है)। तो, प्रदर्शन दृष्टिकोण से गलत संरेखण बहुत खराब है।

आमतौर पर इन कारणों से पैडिंग बाइट को बर्बाद करने के लिए यह उचित है।

अद्यतन: नीचे दी गई टिप्पणियां सभी उपयोगी हैं। मैं उन्हें सलाह देता हूं।

+1

* कैश लाइन से छोटा एक गठबंधन ऑब्जेक्ट हमेशा एक पंक्ति में फिट बैठता है, लेकिन एक असाइन की गई वस्तु दो पंक्तियों *> ** नहीं ** को बाधित कर सकती है। चाहे गठबंधन हो या न हो, कोई वस्तु दो पंक्तियों को झुका दे। –

+1

@MaththieuM।, वास्तव में हाँ और नहीं। कैश-लाइन आकार सबसे बड़े डेटा आकार के गुणक हैं, और कोई अन्य मौलिक प्रकार। इसलिए सभी (er, most) aligned _native_ प्रकार स्वाभाविक रूप से एक कैश-लाइन के भीतर होंगे। इस बात पर विचार करें कि किसी भी 1,2,4,8,16 बाइट संरेखित प्रकार को स्वचालित रूप से 64 या 128 बाइट्स की कैश-लाइन के भीतर फिट करने के लिए गठबंधन किया जाएगा। यदि यह मामला नहीं था तो एक प्रणाली अनिवार्य रूप से अनुपयोगी होगी। –

+1

@ edA-qamort-ora-y: निश्चित रूप से, लेकिन मौलिक प्रकारों का एक चक्र होने वाला एक वस्तु आसानी से दो पंक्तियों को झुका सकता है। भले ही यह छोटा हो। 64 बाइट लाइनों का मानना ​​है, मेरे पास ऑब्जेक्ट 48 बाइट्स बड़ा हो सकता है, और ऐसी ऑब्जेक्ट्स की एक तालिका में, कम से कम दो में से दो कैश लाइनों को खड़ा कर देगा। –

0
क्योंकि आभासी को संबोधित करने का

"... एक पेज आकार सीमा पर एक पृष्ठ संरेखित हार्डवेयर नक्शा पते में उच्च बिट्स प्रतिस्थापन के बजाय जटिल गणित करके एक भौतिक पता करने के लिए एक आभासी पता करने देता है।"

वैसे, मुझे इस अच्छी तरह लिखित पर विकिपीडिया पृष्ठ मिला।

+1

संबंधित नहीं .... –

0

यदि सीपीयू का रजिस्टर आकार 32 बिट्स है, तो यह एक असेंबली निर्देश के साथ 32 बिट सीमाओं पर स्मृति को पकड़ सकता है। यह 32 बिट्स को पकड़ने के लिए धीमा है, और फिर बाइट प्राप्त करें जो बिट 8 से शुरू होता है।

बीटीडब्ल्यू: पैडिंग नहीं होना चाहिए। आप पूछ सकते हैं कि संरचनाओं को पैक किया जाना चाहिए।

+1

पैकिंग संकलक विशिष्ट है, भाषा में नहीं। पैकिंग आरआईएससी मशीनों पर उड़ाएगी, अगर गलत हस्ताक्षर किए गए लोड और स्टोर को संभालने के लिए सीपीयू/कर्नेल समर्थन वहां नहीं है या चालू नहीं है। गति के लिए संरेखण; कुछ मशीनों पर यह एक कठिन आवश्यकता है। – Kaz

1

हार्डवेयर के आधार पर, संरेखण आवश्यक हो सकता है या केवल निष्पादन को तेज करने में मदद कर सकता है।

प्रोसेसर की एक निश्चित संख्या (एआरएम मुझे विश्वास है) जिसमें एक असाइन किए गए पहुंच हार्डवेयर अपवाद की ओर जाता है। सादा और सरल।

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

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