2013-06-13 11 views
17

से छोटे प्रकार के प्रतिनिधित्व का प्रतिनिधित्व मेरे विश्वविद्यालय में एक परियोजना में मैं सीधे जावा बाइटकोड के साथ काम कर रहा हूं।जावा बाइटकोड - int

JVM (http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings) के लिए उपलब्ध निर्देश की सूची ब्राउज़िंग करने के बाद मैंने देखा कि एक स्थानीय चर में पूर्णांक के भंडारण के लिए [b|c|s]store, केवल istore जैसी कोई चीज नहीं होती। इसका मतलब यह है कि अगर मेरे कार्यक्रम में मैं लिखने करता है:

short a; 
int b; 

मैं किसी भी स्मृति बचत नहीं कर रहा हूँ, क्योंकि हर स्थानीय चर प्रविष्टि 4 बाइट पर है?

मैं हमेशा इस धारणा के तहत था कि short या byte प्रकारों का उपयोग रनटाइम पर कुछ स्मृति को बचाएगा।

+2

यह सही लगता है। हालांकि, आपको अभी भी 'बाइट []' एस का उपयोग करके बचत मिलती है। –

उत्तर

13

यह खंड 2.11.1 of the JVMS में समझाया गया है:

ध्यान दें कि सबसे निर्देश [...] अभिन्न प्रकार byte, char, और short के लिए रूपों जरूरत नहीं है। boolean प्रकार के लिए कोई भी रूप नहीं है। एक कंपाइलर जावा वर्चुअल मशीन निर्देशों का उपयोग करते हुए byte और short के शाब्दिक मूल्यों के लोड को एन्कोड करता है जो संकलन-समय या रन-टाइम पर int के मानों पर उन मानों को साइन-इन करते हैं। [...] इस प्रकार, वास्तविक प्रकार boolean, byte, char, और short के मूल्यों पर सबसे संचालन सही ढंग से कम्प्यूटेशनल प्रकार int के मूल्यों पर काम निर्देश द्वारा किया जाता है।

यह इस प्रकार उचित है:

जावा वर्चुअल मशीन के एक-बाइट opcode आकार को देखते हुए, opcodes में एन्कोडिंग प्रकार अपने अनुदेश सेट के डिजाइन पर दबाव डालता है। यदि प्रत्येक टाइप किए गए निर्देश ने जावा वर्चुअल मशीन के रन-टाइम डेटा प्रकारों का समर्थन किया है, तो बाइट में प्रदर्शित किए जाने से अधिक निर्देश होंगे। इसके बजाए, जावा वर्चुअल मशीन का निर्देश सेट कुछ संचालन के लिए कम स्तर के प्रकार का समर्थन प्रदान करता है। दूसरे शब्दों में, निर्देश सेट जानबूझकर ऑर्थोगोनल नहीं है। आवश्यकतानुसार असमर्थित और समर्थित डेटा प्रकारों के बीच रूपांतरित करने के लिए अलग-अलग निर्देशों का उपयोग किया जा सकता है।

हालांकि, यह स्टैक वैरिएबल के लोड/स्टोर पर लागू होता है, यह लोड/स्टोर पर आदिम सरणी में लागू नहीं होता है; सभी आदिम प्रकारों के लिए opcodes हैं।

3

आप स्थानीय int बनाम long बनाकर किसी भी स्मृति को सहेज नहीं रहे हैं क्योंकि ये 64-बिट रजिस्टरों में होने की संभावना है। नोट: बाइट कोड कैसे निर्धारित किया जाता है और कोड वास्तव में कैसे चलाया जाता है वही नहीं है।

किसी भी नए हार्डवेयर पर दो बाइट्स सहेजना महत्वपूर्ण नहीं है। यदि आप न्यूनतम मजदूरी पर हैं तो भी 2 बाइट्स का मान 1/1000 से कम समय है जब भी आपको झपकी मिलती है।

+0

मुझे पता है कि मैं किसी भी महत्वपूर्ण स्मृति को नहीं बचाऊंगा, मैं इस मामले के बारे में उत्सुक था। – Andna

+0

यद्यपि यदि आपके पास अरबों 2-बाइट बचत हैं, तो यह अधिक दिलचस्प हो सकता है ... लेकिन मैं सहमत हूं, आमतौर पर आधुनिक सिस्टम पर कुछ बाइट्स के बारे में सोचने के लिए अपना समय बर्बाद करने का अर्थ नहीं है। – brimborium

+0

हां लेकिन एक एम्बेडेड वातावरण में, वे बाइट्स इसे जोड़कर जोड़ सकते हैं। – SnakeDoc

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