कुछ डेटा प्रकारों को संरेखित करने के लिए पैडिंग किया जाता है, यानी यह सुनिश्चित करने के लिए कि किसी निश्चित प्रकार के डेटा में एक निर्दिष्ट पता है जो कुछ निर्दिष्ट संख्या का एक बहु है। यह सीपीयू के विभिन्न मॉडलों के बीच भिन्न होता है, लेकिन अक्सर 2-बाइट पूर्णांक उन पते पर गठबंधन होते हैं जो 2 और 4-बाइट पूर्णांक के बहुगुणित होते हैं जो कि 4 के गुणक होते हैं। वर्णों को आम तौर पर गठबंधन करने की आवश्यकता नहीं होती है।
तो यदि संरचना में केवल एक फ़ील्ड है, तब तक जब तक उचित सीमा वाले पते पर संरचना रखी जाती है, तो पैडिंग की कोई आवश्यकता नहीं होती है। और यह हमेशा होगा: सिस्टम हमेशा सबसे बड़ी सीमा के लिए ब्लॉक को संरेखित करता है जिसे कभी भी आवश्यक होगा, आमतौर पर 4 बाइट्स या 8 बाइट्स। संरचना में एक चीज एक उचित सीमा पर होगी। समस्या तब होती है जब आपके पास एकाधिक फ़ील्ड होते हैं, तब एक फ़ील्ड की लंबाई का परिणाम अगले क्षेत्र में उचित सीमा पर नहीं हो सकता है। तो आपके उदाहरण में, आपके पास एक char है, जो निश्चित रूप से 1 बाइट लेता है, और एक int, जो 4 लेता है। मान लीजिए कि संरचना 0x1000 पते पर रखी गई है। फिर बिना पैडिंग के, चार को 0x1000 और int 0x1001 पर रखा जाएगा। लेकिन 4-बाइट सीमाओं पर int int अधिक कुशल होते हैं, इसलिए संकलक कुछ पैड बाइट्स को अगली ऐसी सीमा, 0x1004 पर धक्का देने के लिए जोड़ता है। तो अब आपके पास चार (1 बाइट), पैडिंग (3 बाइट्स), int (4 बाइट्स), कुल 8 बाइट्स हैं।
इस मामले में स्थिति में सुधार करने के लिए आप कुछ भी नहीं कर सकते हैं। प्रत्येक संरचना को 4- या 8-बाइट सीमा से गठबंधन किया जाएगा, इसलिए जब न्यूनतम 5 बाइट्स होता है, तो यह हमेशा अभ्यास में कम से कम 8 तक पहुंचने जा रहा है। (आकार केवल सूत्रों के बीच पैडिंग नहीं दिखाएगा, लेकिन केवल स्मृति खो गया है।)
अन्य मामलों में, आप फ़ील्ड के क्रम को दोबारा व्यवस्थित करके अतिरिक्त पैड बाइट्स की संख्या को कम कर सकते हैं। जैसे कि आपके पास तीन char और तीन int था। आप
struct {char a; int b; char c; int d; char e; int f;}
के रूप में संरचना की घोषणा तो संकलक पहले चार के बाद 3 बाइट्स जोड़ने पहले पूर्णांक संरेखित करने के लिए, और फिर दूसरा चार के बाद तीन और बाइट्स दूसरा पूर्णांक संरेखित करने के लिए। यह चार (1) + पैड (3) + int (4) + चार (1) + पैड (3) + int (4) + चार (1) + पैड (3) + int (4) = 24.
देता है
लेकिन बजाय आप इसे घोषित करता है, तो:
struct {char a; char c; char e; int b; int d; int f;}
तो आप चार (1) + चार (1) + चार (1) + पैड (1) + पूर्णांक (4) + पूर्णांक प्राप्त होता (4) + int (4) = 16.
साल पहले मैंने पैडिंग को कम करने के लिए पहले सबसे बड़े तत्वों को रखने के लिए सलाह पढ़ी थी, यानी पहले लम्बे समय, फिर चींटियों, फिर शॉर्ट्स, फिर वर्ण डालें।
यदि आप इनमें से हजारों या लाखों आवंटित कर रहे हैं, तो आप इस तकनीक से बहुत सारी मेमोरी बचा सकते हैं। यदि आप केवल एक या दो आवंटित करने जा रहे हैं, तो इससे कोई फर्क नहीं पड़ता है।
मैं <3 ASCII एआरटी! –
हाय, फिर केस स्ट्रक्चर के बारे में {int b; चार ए; } एक्स; यहां अगर हम 4 से अधिक में मेमोरी लोकेशन से प्रारंभ करने के लिए int और बाद में स्टेट को शुरू करते हैं। पैडिंग भी इस मामले में किया जाता है। यदि सभी डेटामेम्बर सीमा परिस्थितियों का पालन कर रहे हैं तो यहां पैडिंग की आवश्यकता क्यों है? – Laavaa
@ अभिषेक सिंथथ सरणी के कारण। यदि आपके पास 'एक्स एक्स [2]' है, तो दूसरा तत्व - 'x [1] '- को 4 बाइट्स के साथ गठबंधन किया जाना चाहिए क्योंकि इसका पहला सदस्य' int' है, जिसे 4 बाइट्स के साथ गठबंधन किया जाना चाहिए। –