अच्छा सवाल। इस काल्पनिक प्रकार पर विचार करें:
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 ऑप्टिमाइज़ेशन तर्क को भ्रमित करने के लिए प्रेरित करता है (कम से कम, इंटेल के अनुकूलन मैनुअल का कहना है कि यह करता है, हालांकि मुझे इस अंतिम बिंदु का कोई व्यक्तिगत ज्ञान नहीं है)। तो, प्रदर्शन दृष्टिकोण से गलत संरेखण बहुत खराब है।
आमतौर पर इन कारणों से पैडिंग बाइट को बर्बाद करने के लिए यह उचित है।
अद्यतन: नीचे दी गई टिप्पणियां सभी उपयोगी हैं। मैं उन्हें सलाह देता हूं।
* कैश लाइन से छोटा एक गठबंधन ऑब्जेक्ट हमेशा एक पंक्ति में फिट बैठता है, लेकिन एक असाइन की गई वस्तु दो पंक्तियों *> ** नहीं ** को बाधित कर सकती है। चाहे गठबंधन हो या न हो, कोई वस्तु दो पंक्तियों को झुका दे। –
@MaththieuM।, वास्तव में हाँ और नहीं। कैश-लाइन आकार सबसे बड़े डेटा आकार के गुणक हैं, और कोई अन्य मौलिक प्रकार। इसलिए सभी (er, most) aligned _native_ प्रकार स्वाभाविक रूप से एक कैश-लाइन के भीतर होंगे। इस बात पर विचार करें कि किसी भी 1,2,4,8,16 बाइट संरेखित प्रकार को स्वचालित रूप से 64 या 128 बाइट्स की कैश-लाइन के भीतर फिट करने के लिए गठबंधन किया जाएगा। यदि यह मामला नहीं था तो एक प्रणाली अनिवार्य रूप से अनुपयोगी होगी। –
@ edA-qamort-ora-y: निश्चित रूप से, लेकिन मौलिक प्रकारों का एक चक्र होने वाला एक वस्तु आसानी से दो पंक्तियों को झुका सकता है। भले ही यह छोटा हो। 64 बाइट लाइनों का मानना है, मेरे पास ऑब्जेक्ट 48 बाइट्स बड़ा हो सकता है, और ऐसी ऑब्जेक्ट्स की एक तालिका में, कम से कम दो में से दो कैश लाइनों को खड़ा कर देगा। –