यह विशिष्ट रूप से ढेर नहीं है, लेकिन सामान्य रूप से संरेखण नहीं है। शायद शब्द पूर्णांक एकाधिक के बारे में सोचो।
यदि आपके पास स्मृति में आइटम हैं जो कि आकार में बाइट हैं, 1 की इकाइयां हैं, तो बस यह कहें कि वे सभी गठबंधन हैं। चीजें जो आकार में दो बाइट हैं, फिर पूर्णांक समय 2 को गठबंधन किया जाएगा, 0, 2, 4, 6, 8, आदि। और गैर-पूर्णांक गुणक, 1, 3, 5, 7 को गठबंधन नहीं किया जाएगा। आइटम जो 4 बाइट आकार में हैं, पूर्णांक गुणक 0, 4, 8, 12, आदि गठबंधन हैं, 1,2,3,5,6,7, आदि नहीं हैं। 8, 0,8,16,24 और 16 16,32,48,64, और इसी तरह के लिए चला जाता है।
इसका क्या अर्थ है कि आप आइटम के लिए मूल पता देख सकते हैं और यह निर्धारित कर सकते हैं कि यह गठबंधन है या नहीं।
size in bytes, address in the form of
1, xxxxxxx
2, xxxxxx0
4, xxxxx00
8, xxxx000
16,xxx0000
32,xx00000
64,x000000
and so on
एक संकलक .text खंड यह काफी के रूप में आवश्यक डेटा संरेखित करने के लिए सीधा है निर्देश के साथ डेटा में मिश्रण के मामले में (अच्छी तरह से, वास्तुकला पर निर्भर करता है)। लेकिन ढेर एक रनटाइम चीज है, संकलक सामान्य रूप से निर्धारित नहीं कर सकता कि स्टैक रन टाइम पर कहाँ होगा। तो रनटाइम पर यदि आपके पास स्थानीय वेरिएबल हैं जिन्हें गठबंधन करने की आवश्यकता है तो आपको कोड को प्रोग्रामिक रूप से स्टैक समायोजित करने की आवश्यकता होगी।
उदाहरण के लिए कहें कि आपके पास ढेर पर दो 8 बाइट आइटम हैं, 16 कुल बाइट्स हैं, और आप वास्तव में उन्हें गठबंधन करना चाहते हैं (8 बाइट सीमाओं पर)। प्रवेश पर समारोह सामान्य रूप से इन दो वस्तुओं के लिए जगह बनाने के लिए स्टैक पॉइंटर से 16 घटाएगा। लेकिन उन्हें संरेखित करने के लिए और कोड होना आवश्यक होगा। अगर हम चाहते थे कि इन दो 8 बाइट आइटम 8 बाइट सीमाओं पर गठबंधन हों और 16 घटाए जाने के बाद स्टैक पॉइंटर 0xFF82 था, तो कम 3 बिट्स 0 नहीं हैं, इसलिए यह गठबंधन नहीं है। निचले तीन बिट 0b010 हैं। एक सामान्य अर्थ में हम 0xFF80 प्राप्त करने के लिए 0xFF82 से 2 घटा सकते हैं। हम कैसे निर्धारित करते हैं कि यह 2 बीबी 1 (0x7) के साथ और उस राशि को घटाना होगा। इसका मतलब है एयू संचालन एक और एक घटाना। लेकिन अगर हम और 0x7 (~ 0x7 = 0xFFFF ... FFF8) के पूरक मूल्य के साथ हम एक शॉर्टकट ले सकते हैं तो हमें एक अलू ऑपरेशन का उपयोग करके 0xFF80 मिलता है (जब तक संकलक और प्रोसेसर के पास ऐसा करने के लिए एक एकल ऑपोड तरीका होता है, यदि नहीं, तो यह आपको और अधिक घटाने से अधिक खर्च कर सकता है)।
ऐसा लगता है कि आपका प्रोग्राम क्या कर रहा था। -16 के साथ एंडिंग 0xFFFF के साथ एंडिंग जैसा ही है .... एफएफएफ 0, जिसके परिणामस्वरूप एक 16 बाइट सीमा पर गठबंधन किया गया पता है।
तो यह लपेट के लिए, यदि आप एक ठेठ ढेर सूचक है कि उच्च पतों के माध्यम से स्मृति नीचे अपनी तरह से काम करता पतों कम करने के लिए की तरह कुछ है, तो आप
sp = sp & (~(n-1))
करना चाहते हैं जहां n बाइट की संख्या है संरेखित करने के लिए (शक्तियां होनी चाहिए लेकिन यह ठीक है अधिकांश संरेखण में आमतौर पर दो की शक्तियां शामिल होती हैं)। यदि आप एक malloc किया कहना है (पते को निम्न से उच्च वृद्धि) और कुछ का पता संरेखित करना चाहते हैं तो
if(ptr&(~(n-)) { ptr = (ptr+n)&(~(n-1)); }
(एक से अधिक आप की जरूरत malloc के लिए कम से कम संरेखण आकार से याद) या यदि आप चाहते हैं बस बाहर निकलें और हर बार जोड़ें और मुखौटा करें।
कई/अधिकांश गैर-x86 आर्किटेक्चर में संरेखण नियम और आवश्यकताएं हैं। x86 उतना ही लचीला है जब तक कि निर्देश सेट चला जाता है, लेकिन जहां तक निष्पादन जाता है, आप x86 पर असाइन किए गए एक्सेस के लिए जुर्माना दे सकते हैं, तो भले ही आप इसे कर सकें, आपको किसी भी के साथ गठबंधन करने का प्रयास करना चाहिए अन्य वास्तुकला। शायद यही वह कोड था जो यह कर रहा था।
http://en.wikipedia.org/wiki/Data_structure_alignment – chrisaycock
ऑप्टिमाइज़र को सक्षम किए बिना मशीन कोड को देखने के लिए बहुत अधिक समझदारी नहीं होती है। –