उदाहरण के लिए यदि मेरे पास दो मामलों के साथ एनम है, तो क्या यह बूलियन की तुलना में अधिक स्मृति लेता है? भाषाएं: जावा, सी ++Enums कितनी मेमोरी लेते हैं?
उत्तर
जावा में, एक enum
is a full-blown class:
जावा प्रोग्रामिंग भाषा enum प्रकार ज्यादा अन्य भाषाओं में उनकी समकक्षों की तुलना में अधिक शक्तिशाली हैं। enum घोषणा एक कक्षा (जिसे एनम प्रकार कहा जाता है) परिभाषित करता है। Enum वर्ग शरीर में विधियों और अन्य फ़ील्ड शामिल हो सकते हैं।
आदेश प्रत्येक enum
के वास्तविक आकार को देखने के लिए, चलो एक वास्तविक enum
बनाने के लिए और यह बनाता है class
फ़ाइल की सामग्री की जांच करते हैं में।
मान लीजिए कि हम निम्न Constants
enum वर्ग करते हैं:
public enum Constants {
ONE,
TWO,
THREE;
}
संकलन ऊपर enum
और disassembling javap
साथ class
फ़ाइल जिसके परिणामस्वरूप निम्न देता है:
Compiled from "Constants.java"
public final class Constants extends java.lang.Enum{
public static final Constants ONE;
public static final Constants TWO;
public static final Constants THREE;
public static Constants[] values();
public static Constants valueOf(java.lang.String);
static {};
}
disassembly पता चलता है कि प्रत्येक क्षेत्र है कि enum
Constants
enum
कक्षा का एक उदाहरण है। इसलिए (javap
साथ आगे के विश्लेषण का पता चलता है कि प्रत्येक क्षेत्र स्थिर प्रारंभ ब्लॉक में new Constants(String)
निर्माता को फोन करके एक नई वस्तु बनाने के द्वारा आरंभ नहीं हो जाता।)
, हम बता सकते हैं कि प्रत्येक enum
क्षेत्र है कि हम बनाने के लिए कम से कम के रूप में किया जाएगा JVM में ऑब्जेक्ट बनाने का ओवरहेड जितना अधिक होगा।
नहीं, एक enum आमतौर पर एक int के समान आकार है, बुलियन के समान।
यह इसलिए 'आम तौर पर' हो सकता है। अगर कोई और विवरण बिना किसी सवाल पूछ रहा है, हालांकि, इस तरह के किनारे के मामले शायद ही कभी महत्वपूर्ण हैं। –
जावा और सी ++ टैग इंगित करते हैं कि इस टिप्पणी में इस संदर्भ में सही उत्तर है। –
ठीक है, आगे के शोध पर, ऐसा लगता है कि जावा का उत्तर सही नहीं है। (ओटी: यह सी # में एक int के समान है।) –
जावा में, इसमें अधिक मेमोरी होगी। सी ++ में, यह एक ही प्रकार के निरंतर के लिए आवश्यक स्मृति से अधिक स्मृति नहीं लेगा (यह संकलन समय पर मूल्यांकन किया गया है और रनटाइम पर कोई अवशिष्ट महत्व नहीं है)। सी ++ में, इसका मतलब है कि एक enum के लिए डिफ़ॉल्ट प्रकार एक int के रूप में एक ही स्थान पर कब्जा करेगा।
अपने enum कभी केवल दो मामलों होगा, तो वास्तव में एक बूलियन उपयोग करने के बजाय एक बेहतर विचार (स्मृति आकार, प्रदर्शन, उपयोग/तर्क), और भी अधिक जावा में हो सकता है।
यदि आप स्मृति लागत के बारे में सोच रहे हैं, तो हो सकता है कि आप उनमें से बहुत से उपयोग करने की योजना बना रहे हों। जावा में आप बिट्ससेट क्लास का उपयोग कर सकते हैं, या छोटे पैमाने पर, दोनों भाषाओं में आप बिट्स ऑपरेशंस के साथ बिट्स में हेरफेर कर सकते हैं।
bool
एक एकल बाइट के रूप में लागू किया जा सकता है, लेकिन आम तौर पर एक संरचना में यह अन्य तत्वों संरेखण आवश्यकताओं मतलब यह होगा कि कि बूलियन प्रभावी रूप से कम से कम एक int
जितना अंतरिक्ष कब्जे की जाएगी है से घिरा हो जाएगा।
आधुनिक प्रोसेसर मुख्य मेमोरी से डेटा को पूरे कैश लाइन, 64 बाइट्स के रूप में लोड करते हैं। एल 1 कैश से एक बाइट लोड करने और चार बाइट लोड करने के बीच अंतर नगण्य है।
यदि आप बहुत उच्च प्रदर्शन अनुप्रयोग में कैश लाइनों के लिए अनुकूलित करने का प्रयास कर रहे हैं, तो आप चिंता कर सकते हैं कि आपका enum कितना बड़ा है, लेकिन आम तौर पर मैं कहूंगा कि एक बूलियन का उपयोग करने के बजाय एक enum को परिभाषित करना स्पष्ट है ।
जावा में, स्मृति में आपके enum के प्रत्येक मान का केवल एक उदाहरण होना चाहिए। Enum के लिए एक संदर्भ के लिए केवल उस संदर्भ के लिए भंडारण की आवश्यकता है। एक enum के मूल्य की जांच किसी अन्य संदर्भ तुलना के रूप में कुशल है।
बड़ी मात्रा में enums संग्रहीत करते समय आप केवल इसके बारे में चिंता करेंगे। जावा के लिए, आप कुछ मामलों में एनमसेट का उपयोग करने में सक्षम हो सकते हैं। यह आंतरिक रूप से थोड़ा वेक्टर का उपयोग करता है जो बहुत ही कुशल और तेज़ है।
http://java.sun.com/j2se/1.5.0/docs/api/java/util/EnumSet.html
sizeof (enum) क्या आप enum में है पर निर्भर करता है। मैं हाल ही में डिफॉल्ट कन्स्ट्रक्टर पैराम्स के साथ एक ऐरेलिस्ट() के आकार को खोजने की कोशिश कर रहा था और अंदर संग्रहीत कोई ऑब्जेक्ट नहीं है (जिसका मतलब है कि स्टोर करने की क्षमता 10 है)। यह पता चला कि ArrayList बहुत बड़ा < 100 बाइट्स नहीं है।
तो, एक बहुत ही सरल enum के लिए sizeof (enum) 10 बाइट से कम होना चाहिए। आप एक छोटा प्रोग्राम लिख सकते हैं, इसे एक निश्चित मात्रा में स्मृति दे सकते हैं और फिर enums आवंटित करने का प्रयास करें। आप यह पता लगा लिए सक्षम होना चाहिए
बीआर,
~ एक
सी में (कि मैं कैसे ArrayList की स्मृति में पता चला है) ++ एक enum आम तौर पर एक int
रूप में एक ही आकार है। ऐसा कहा जाता है कि कंपेलरों के लिए कमांड लाइन स्विच प्रदान करने के लिए असामान्य नहीं है ताकि एनम के आकार को छोटे आकार में सेट किया जा सके जो निर्धारित मूल्यों की सीमा को फिट कर सके।
सी/सी ++ में एक enum एक int के समान आकार होगा।
जीसीसी के साथ आप विशेषता ((पैक)) को एनम परिभाषा में न्यूनतम पदचिह्न लेने के लिए जोड़ सकते हैं। यदि enum में सबसे बड़ा मान < 256 है इस एक बाइट, दो बाइट्स अगर सबसे बड़ा मान < 65536, है आदि
typedef enum {
MY_ENUM0,
MY_ENUM1,
MY_ENUM2,
MY_ENUM3,
MY_ENUM4,
MY_ENUM5
} __attribute__((packed)) myEnum_e;
मुझे काफी यकीन है कि __attribute __ ((पैक किया गया)) एक जीसीसी-केवल एक्सटेंशन है।अगर मुझे सही याद है, तो सी 99 "पैकिंग" के लिए मानक प्रज्ञा निर्दिष्ट नहीं करता है, इसलिए प्रत्येक कंपाइलर इसे अलग करता है। –
आप शायद सही हैं। यह मेरी यादें थी कि पैक एक सी 99 फीचर थी, लेकिन मेरी याददाश्त अक्सर असंतुलित और असंगत होती है। मैंने सी 99 संदर्भ हटा दिया। – DGentry
आईएसओ C++ में वहाँ कोई दायित्व नहीं है एक enum से बड़े होने के लिए है हो जाएगा इसकी सबसे बड़ा गणक की आवश्यकता है। विशेष रूप से, enum {TRUE, FALSE} का आकार (1) हो सकता है जब आकार (बूल) == आकार (int)। बस कोई आवश्यकता नहीं है। कुछ कंपाइलर एक इंट के समान आकार को बनाते हैं। यह एक कंपाइलर सुविधा है, जिसे अनुमति है क्योंकि मानक केवल न्यूनतम लगाता है। अन्य कंपाइलर एनम के आकार को नियंत्रित करने के लिए एक्सटेंशन का उपयोग करते हैं।
मुझे लगता है कि अधिकांश सीपीयू आर्किटेक्चर के लिए देशी आकार का उपयोग करते हैं। 32-बिट गठबंधन डेटा अधिकांश 32-बिट CPUs के लिए पुनर्प्राप्त करने के लिए तेज़ है, इसलिए अधिकांश प्रकार 32 बिट्स के गुणक के रूप में समाप्त होते हैं। – gbjbaanb
- 1. मेरे जावा धागे कितनी मेमोरी लेते हैं?
- 2. आप संस्करण नियंत्रण कितनी दूर लेते हैं?
- 3. आप कोड कवरेज कितनी दूर लेते हैं?
- 4. क्या टेबल स्लाइस आर में मेमोरी लेते हैं?
- 5. शून्य SQLite डेटा फ़ील्ड अतिरिक्त मेमोरी लेते हैं?
- 6. सी # enums टाइपएफ़ हैं?
- 7. कैसे मुक्त() जानते हैं कि कितनी मेमोरी को हटाना है?
- 8. एनडीके में कितनी मेमोरी आवंटन है?
- 9. एक प्रक्रिया में कितनी मेमोरी लॉक हुई
- 10. हैशटेबल कितनी मेमोरी का उपयोग करता है?
- 11. enums
- 12. एंड्रॉइड रूट डिवाइस पर स्क्रीनशॉट लेते हैं
- 13. ec2 मशीनें कितनी स्थिर हैं?
- 14. MySQL घटनाएं कितनी महंगी हैं?
- 15. कितनी ऑब्जेक्ट्स बनाई गई हैं
- 16. Enums खतरनाक के लिए कस्टम विशेषताएँ हैं?
- 17. क्या जेडीबीसी द्वारा समर्थित enums हैं?
- 18. जावा enums क्लोनबल क्यों नहीं हैं?
- 19. जावा enums mutability उपयोगकेस और संभावनाओं enums?
- 20. मॉलोक -> कितनी मेमोरी आवंटित की गई है?
- 21. रेल एप्लिकेशन पर रूबी कितनी मेमोरी का उपभोग करेगी?
- 22. मेमोरी-मैप की गई फ़ाइल कितनी बड़ी हो सकती है?
- 23. आईफोन ऐप कितनी मेमोरी का उपयोग कर सकता है?
- 24. इससे पहले कि कितनी मेमोरी खराब हो जाए?
- 25. उपलब्ध Enums
- 26. zlib, डिफ्लेट: आवंटित करने के लिए कितनी मेमोरी है?
- 27. विरोधाभासी enums
- 28. सी # Enums
- 29. निर्धारित करें कि कक्षा कितनी मेमोरी का उपयोग करती है?
- 30. हास्केल: मोनैडिक लेते समय?
32-बिट प्लेटफ़ॉर्म पर, यह एक ही आकार के समान आकार होगा - यह एनम उदाहरण के लिए केवल एक (32 बिट) पॉइंटर है। स्मृति में प्रत्येक enum मान का केवल एक उदाहरण मौजूद है। – thenickdude
-1 "एक सादा पूर्णांक से थोड़ा अधिक भारी"? इसका क्या मतलब है, और आप पाठ से कहां प्राप्त करते हैं? –