यह कई कारकों पर निर्भर करता है। यदि आप एक समय में पिक्सेल डेटा एक बाइट तक पहुंच रहे हैं, तो संरेखण समय के विशाल बहुमत में कोई फर्क नहीं पड़ेगा। डेटा के एक बाइट को पढ़ने/लिखने के लिए, अधिकांश प्रोसेसर इस बात पर परवाह नहीं करेंगे कि बाइट 4-बाइट सीमा पर है या नहीं।
हालांकि, यदि आप बाइट से बड़े इकाइयों में डेटा एक्सेस कर रहे हैं (कहें, 2-बाइट या 4-बाइट इकाइयों में), तो आप निश्चित रूप से संरेखण प्रभाव देखेंगे। कुछ प्रोसेसर (उदाहरण के लिए कई आरआईएससी प्रोसेसर) के लिए, कुछ स्तरों पर असाइन किए गए डेटा तक पहुंचना पूरी तरह गैरकानूनी है: 4-बाइट गठबंधन वाले पते से 4-बाइट शब्द पढ़ने का प्रयास करना डेटा एक्सेस अपवाद (या डेटा संग्रहण अपवाद) उत्पन्न करेगा) उदाहरण के लिए, एक पावरपीसी पर।
अन्य प्रोसेसर (उदा। X86) पर, असाइन किए गए पते तक पहुंचने की अनुमति है, लेकिन यह अक्सर एक छिपे प्रदर्शन प्रदर्शन के साथ आता है। मेमोरी लोड/स्टोर अक्सर माइक्रोकोड में लागू होते हैं, और माइक्रोकोड अनियंत्रित पहुंच का पता लगाएगा। आम तौर पर, माइक्रोकोड मेमोरी से उचित 4-बाइट मात्रा लाएगा, लेकिन अगर इसे गठबंधन नहीं किया गया है, तो उसे दो स्मृति से 4-बाइट स्थानों को लाने और दो के उचित बाइट से वांछित 4-बाइट मात्रा को पुनर्निर्माण करना होगा स्थानों। दो स्मृति स्थानों को प्राप्त करना स्पष्ट रूप से एक से धीमा है।
हालांकि यह केवल साधारण लोड और स्टोर के लिए है। कुछ निर्देश, जैसे कि एमएमएक्स या एसएसई निर्देश सेट में, उनके मेमोरी ऑपरेंड को सही तरीके से गठबंधन करने की आवश्यकता होती है। यदि आप उन विशेष निर्देशों का उपयोग करके अनलिखित स्मृति तक पहुंचने का प्रयास करते हैं, तो आपको कुछ अवैध निर्देश अपवाद की तरह दिखाई देगा।
संक्षेप में, मैं वास्तव में संरेखण के बारे में बहुत ज्यादा चिंता नहीं करता जबतक कि आप सुपर प्रदर्शन-महत्वपूर्ण कोड (उदा। असेंबली में) लिख रहे हों। कंपाइलर आपको बहुत मदद करता है, उदा। पैडिंग संरचनाओं द्वारा ताकि 4-बाइट मात्रा 4-बाइट सीमाओं पर गठबंधन की जा सके, और x86 पर, सीपीयू अनचाहे पहुंच से निपटने के दौरान भी आपकी मदद करता है। चूंकि आप जिस पिक्सेल डेटा से निपट रहे हैं वह 3 बाइट्स की मात्रा में है, इसलिए आप लगभग हमेशा एक बाइट एक्सेस कर रहे हैं।
यदि आप निर्णय लेते हैं कि आप एकवचन 4-बाइट एक्सेस (3 3-बाइट एक्सेस के विपरीत) में पिक्सल तक पहुंचना चाहते हैं, तो 32-बिट पिक्सेल का उपयोग करना बेहतर होगा और प्रत्येक व्यक्तिगत पिक्सेल को 4- बाइट सीमा। प्रत्येक पंक्ति को 4-बाइट सीमा पर संरेखित करना, लेकिन प्रत्येक पिक्सेल में थोड़ा, यदि कोई हो, प्रभाव नहीं होगा।
आपके कोड के आधार पर, मुझे लगता है कि यह विंडोज बिटमैप फ़ाइल प्रारूप को पढ़ने से संबंधित है - बिटमैप फ़ाइलों को प्रत्येक स्कैनलाइन की लंबाई 4 बाइट्स के एकाधिक की आवश्यकता होती है, इसलिए उस संपत्ति के साथ अपने पिक्सेल डेटा बफर सेट करना उस संपत्ति में जिसे आप केवल पूरे बिटमैप में पढ़ सकते हैं, आपके बफर में झुका हुआ है (बेशक, आपको अभी भी इस तथ्य से निपटना होगा कि स्कैनलाइन को नीचे से नीचे की बजाय नीचे-से-ऊपर संग्रहीत किया जाता है और पिक्सेल डेटा आरजीबी के बजाय बीजीआर है)।यह वास्तव में एक लाभ का अधिक नहीं है, हालांकि - एक समय में एक स्कैनलाइन बिटमैप में पढ़ने के लिए इतना कठिन नहीं है।
-मललाइन को स्टैक और कोड संरेखण के साथ करना है, यह यहां प्रासंगिक नहीं है। स्मृति को एक 'मॉलोक' के साथ आवंटित किया जाता है जो एक संगत खंड उत्पन्न करता है। यदि पंक्ति की लंबाई 'चौड़ाई * बाइट्सपीरपीक्सेल' 4 (या मूल शब्द आकार, या एक सिम रजिस्टर, या कैश लाइन, अनुप्रयोग के आधार पर विभाजित नहीं है), तो कई पंक्तियों तक पहुंच को असाइन नहीं किया जाएगा। ऊपर संरेखण प्रभावी रूप से प्रत्येक पंक्ति को आवश्यक से थोड़ा लंबा बना रहा है, ताकि वे सभी गठबंधन हो जाएं। संकलक इस अनुकूलन नहीं कर सकता है। लेकिन इस उदाहरण में, अतिरिक्त संरेखण एक नो-ऑप है क्योंकि '1280 * 3% 256 = 0'। – Jed
मुझे -मलिन के बारे में पता है। मैं सामान्य रूप से संरेखण के बारे में बात कर रहा था। – arhuaco