2017-04-22 15 views
13

हाल ही में मैंने देखा कि कैसे एक कंपाइलर दो 32 बिट पूर्णांक संयुक्त करता है जो एक वर्ग के गुणों के मूल्य थे और उन्हें 64 बिट पूर्णांक के रूप में संग्रहीत किया गया था। मेरा सवाल अब है, यह क्यों किया जाता है? पूर्णांक संयोजन करते समय क्या फायदे हैं?आप दो 32 बिट पूर्णांक को 64 बिट पूर्णांक में क्यों जोड़ेंगे?

उदाहरण के लिए

अगर हम था इसलिए बजाय एक वर्ग

class FooBar { 
int x = 1; 
int y = 100; 
} 

के निम्नलिखित गुण

i32 = 00000001 
i32 = 01100100 

हम पाते हैं:

i64 = 0000000101100100 

आप उन्हें क्यों गठबंधन चाहते हैं?

+6

मेरा अनुमान है कि रजिस्टर 64 बिट्स का उपयोग करता है। यह दो रजिस्टरों का उपयोग करने के बजाय दोनों स्टोर करने के लिए केवल एक रजिस्टर का उपयोग कर रहा है। –

+0

क्यों नहीं? यदि मशीन 64 बिट पूर्णांक के साथ अधिक कुशलता से काम करती है तो यह एक जीत हो सकती है .. किसी भी मामले में; तुम क्यो फिकर करते हो? –

+2

सीपीयू आमतौर पर प्रकार नहीं होते हैं। 'Int' की तरह कुछ आपके प्रोग्राम की एक संपत्ति है, न कि परिणामी मशीन कोड की। यह "संयोजन" को कॉल करने के लिए वास्तव में उचित नहीं है, क्योंकि पहले और बाद में पूरी तरह से अलग डोमेन के हिस्से हैं। –

उत्तर

10

मौजूदा (जैसा कि मैं इसे लिखता हूं) उत्तर और टिप्पणियां, आंशिक रूप से सही होने पर, इस अनुकूलन के बिंदु को याद करते हैं। यह एक निर्देश (64-बिट डेटा के साथ काम करने) के साथ दो निर्देशों (32-बिट डेटा के साथ काम करना) को प्रतिस्थापित करना है। इसके परिणामस्वरूप कोड आकार और शायद निष्पादन समय में बहुत ही कम कमी आती है।

कंपाइलर एक 64-बिट निर्देश के साथ दोनों चर शुरू कर रहा है (क्योंकि वे लगातार स्मृति पते साझा करते हैं)। चर अलग हैं, और अलग से उपयोग किया जाएगा। कोई स्थानांतरण या मास्किंग की आवश्यकता नहीं है।

यह अक्सर रचनाकारों में देखा जाता है जब कई सदस्यों को प्रारंभ किया जाता है। एक निरंतर मामला शून्य प्रारंभिकता के साथ होता है, जहां संकलक एक रजिस्टर को शून्य कर देगा, फिर एक से अधिक सदस्यों को प्रारंभ करने के लिए उस मान का उपयोग करें, जिसमें एक बड़े एकल लेखन के साथ लगातार मेमोरी पतों को लिखना होगा (उदाहरण के लिए, 16-बिट लघु शून्य मान लिखकर दो 8-बिट वाले के बजाय)।

+0

आपके उत्तर को स्वीकार किया क्योंकि मुझे लगता है कि यह बहुत अधिक पूर्ण है। – Asperger

+0

यह एक सही उत्तर है, गंभीरता से। धन्यवाद – Asperger

+3

> कोई स्थानांतरण या मास्किंग की आवश्यकता नहीं है। मैं उस बिंदु से असहमत हूं। 4 बाइट संरेखण का उपयोग करने के लिए आपको मेमोरी स्पेस को उपनाम करना होगा। यह लिंक देखें: https://software.intel.com/en-us/articles/coding-for-performance-data-alignment-and- संरचनाएं उसने कहा, मुझे लगता है कि आप सही हैं कि किसी पते को 32 या 64 प्रदर्शन के संबंध में "मुक्त" है। अच्छा उत्तर। – Sam

5

मुझे विश्वास है कि आप एक अनुकूलन देख रहे हैं। इंटेल निर्देश जैसे PADDSW एकाधिक पैक किए गए ऑपरेंड मानते हैं।

https://en.wikipedia.org/wiki/X86_instruction_listings

वहाँ भी केवल एक 64 बिट वास्तुकला कैश में 1 प्रविष्टि का उपयोग करने में लाभ हैं।

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

सी सी स्ट्रक्चर के सभी सदस्यों को एक शब्द सीमा पर संरेखित करना सामान्य होता था। यह एक एकल char है और int पैक नहीं किया जाएगा, लेकिन मशीन के शब्द आकार से गठबंधन किया जाएगा। तो, struct { char, int} में 8 बाइट्स के sizeof(..) होंगे। मुझे लगता है कि स्थिति फिसल गई है?

बहुत रोचक।

+0

क्या आपने शायद वेबसाइकिलों का सही ध्यान रखा है? वे वहां कर रहे हैं। आप जो कह रहे हैं वह वास्तव में दिलचस्प है – Asperger

+0

'पीएडी ...' निर्देश सिम के लिए हैं। वे पैक पैक मूल्य एक ही प्रकार के हैं। अनपॅक करने की कोई कीमत नहीं है, क्योंकि व्यक्तिगत मानों में अभी भी सामान्य पते हैं। –

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