2008-09-27 30 views

उत्तर

41

जावा में, एक 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 पता चलता है कि प्रत्येक क्षेत्र है कि enumConstantsenum कक्षा का एक उदाहरण है। इसलिए (javap साथ आगे के विश्लेषण का पता चलता है कि प्रत्येक क्षेत्र स्थिर प्रारंभ ब्लॉक में new Constants(String) निर्माता को फोन करके एक नई वस्तु बनाने के द्वारा आरंभ नहीं हो जाता।)

, हम बता सकते हैं कि प्रत्येक enum क्षेत्र है कि हम बनाने के लिए कम से कम के रूप में किया जाएगा JVM में ऑब्जेक्ट बनाने का ओवरहेड जितना अधिक होगा।

+12

32-बिट प्लेटफ़ॉर्म पर, यह एक ही आकार के समान आकार होगा - यह एनम उदाहरण के लिए केवल एक (32 बिट) पॉइंटर है। स्मृति में प्रत्येक enum मान का केवल एक उदाहरण मौजूद है। – thenickdude

+3

-1 "एक सादा पूर्णांक से थोड़ा अधिक भारी"? इसका क्या मतलब है, और आप पाठ से कहां प्राप्त करते हैं? –

0

नहीं, एक enum आमतौर पर एक int के समान आकार है, बुलियन के समान।

+0

यह इसलिए 'आम तौर पर' हो सकता है। अगर कोई और विवरण बिना किसी सवाल पूछ रहा है, हालांकि, इस तरह के किनारे के मामले शायद ही कभी महत्वपूर्ण हैं। –

+0

जावा और सी ++ टैग इंगित करते हैं कि इस टिप्पणी में इस संदर्भ में सही उत्तर है। –

+0

ठीक है, आगे के शोध पर, ऐसा लगता है कि जावा का उत्तर सही नहीं है। (ओटी: यह सी # में एक int के समान है।) –

4

जावा में, इसमें अधिक मेमोरी होगी। सी ++ में, यह एक ही प्रकार के निरंतर के लिए आवश्यक स्मृति से अधिक स्मृति नहीं लेगा (यह संकलन समय पर मूल्यांकन किया गया है और रनटाइम पर कोई अवशिष्ट महत्व नहीं है)। सी ++ में, इसका मतलब है कि एक enum के लिए डिफ़ॉल्ट प्रकार एक int के रूप में एक ही स्थान पर कब्जा करेगा।

0

अपने enum कभी केवल दो मामलों होगा, तो वास्तव में एक बूलियन उपयोग करने के बजाय एक बेहतर विचार (स्मृति आकार, प्रदर्शन, उपयोग/तर्क), और भी अधिक जावा में हो सकता है।
यदि आप स्मृति लागत के बारे में सोच रहे हैं, तो हो सकता है कि आप उनमें से बहुत से उपयोग करने की योजना बना रहे हों। जावा में आप बिट्ससेट क्लास का उपयोग कर सकते हैं, या छोटे पैमाने पर, दोनों भाषाओं में आप बिट्स ऑपरेशंस के साथ बिट्स में हेरफेर कर सकते हैं।

7

bool एक एकल बाइट के रूप में लागू किया जा सकता है, लेकिन आम तौर पर एक संरचना में यह अन्य तत्वों संरेखण आवश्यकताओं मतलब यह होगा कि कि बूलियन प्रभावी रूप से कम से कम एक int जितना अंतरिक्ष कब्जे की जाएगी है से घिरा हो जाएगा।

आधुनिक प्रोसेसर मुख्य मेमोरी से डेटा को पूरे कैश लाइन, 64 बाइट्स के रूप में लोड करते हैं। एल 1 कैश से एक बाइट लोड करने और चार बाइट लोड करने के बीच अंतर नगण्य है।

यदि आप बहुत उच्च प्रदर्शन अनुप्रयोग में कैश लाइनों के लिए अनुकूलित करने का प्रयास कर रहे हैं, तो आप चिंता कर सकते हैं कि आपका enum कितना बड़ा है, लेकिन आम तौर पर मैं कहूंगा कि एक बूलियन का उपयोग करने के बजाय एक enum को परिभाषित करना स्पष्ट है ।

16

जावा में, स्मृति में आपके enum के प्रत्येक मान का केवल एक उदाहरण होना चाहिए। Enum के लिए एक संदर्भ के लिए केवल उस संदर्भ के लिए भंडारण की आवश्यकता है। एक enum के मूल्य की जांच किसी अन्य संदर्भ तुलना के रूप में कुशल है।

8

बड़ी मात्रा में enums संग्रहीत करते समय आप केवल इसके बारे में चिंता करेंगे। जावा के लिए, आप कुछ मामलों में एनमसेट का उपयोग करने में सक्षम हो सकते हैं। यह आंतरिक रूप से थोड़ा वेक्टर का उपयोग करता है जो बहुत ही कुशल और तेज़ है।

http://java.sun.com/j2se/1.5.0/docs/api/java/util/EnumSet.html

0

sizeof (enum) क्या आप enum में है पर निर्भर करता है। मैं हाल ही में डिफॉल्ट कन्स्ट्रक्टर पैराम्स के साथ एक ऐरेलिस्ट() के आकार को खोजने की कोशिश कर रहा था और अंदर संग्रहीत कोई ऑब्जेक्ट नहीं है (जिसका मतलब है कि स्टोर करने की क्षमता 10 है)। यह पता चला कि ArrayList बहुत बड़ा < 100 बाइट्स नहीं है।

तो, एक बहुत ही सरल enum के लिए sizeof (enum) 10 बाइट से कम होना चाहिए। आप एक छोटा प्रोग्राम लिख सकते हैं, इसे एक निश्चित मात्रा में स्मृति दे सकते हैं और फिर enums आवंटित करने का प्रयास करें। आप यह पता लगा लिए सक्षम होना चाहिए

बीआर,
~ एक

1

सी में (कि मैं कैसे ArrayList की स्मृति में पता चला है) ++ एक enum आम तौर पर एक int रूप में एक ही आकार है। ऐसा कहा जाता है कि कंपेलरों के लिए कमांड लाइन स्विच प्रदान करने के लिए असामान्य नहीं है ताकि एनम के आकार को छोटे आकार में सेट किया जा सके जो निर्धारित मूल्यों की सीमा को फिट कर सके।

0

सी/सी ++ में एक enum एक int के समान आकार होगा।

जीसीसी के साथ आप विशेषता ((पैक)) को एनम परिभाषा में न्यूनतम पदचिह्न लेने के लिए जोड़ सकते हैं। यदि enum में सबसे बड़ा मान < 256 है इस एक बाइट, दो बाइट्स अगर सबसे बड़ा मान < 65536, है आदि

typedef enum { 
    MY_ENUM0, 
    MY_ENUM1, 
    MY_ENUM2, 
    MY_ENUM3, 
    MY_ENUM4, 
    MY_ENUM5 
} __attribute__((packed)) myEnum_e; 
+0

मुझे काफी यकीन है कि __attribute __ ((पैक किया गया)) एक जीसीसी-केवल एक्सटेंशन है।अगर मुझे सही याद है, तो सी 99 "पैकिंग" के लिए मानक प्रज्ञा निर्दिष्ट नहीं करता है, इसलिए प्रत्येक कंपाइलर इसे अलग करता है। –

+0

आप शायद सही हैं। यह मेरी यादें थी कि पैक एक सी 99 फीचर थी, लेकिन मेरी याददाश्त अक्सर असंतुलित और असंगत होती है। मैंने सी 99 संदर्भ हटा दिया। – DGentry

3

आईएसओ C++ में वहाँ कोई दायित्व नहीं है एक enum से बड़े होने के लिए है हो जाएगा इसकी सबसे बड़ा गणक की आवश्यकता है। विशेष रूप से, enum {TRUE, FALSE} का आकार (1) हो सकता है जब आकार (बूल) == आकार (int)। बस कोई आवश्यकता नहीं है। कुछ कंपाइलर एक इंट के समान आकार को बनाते हैं। यह एक कंपाइलर सुविधा है, जिसे अनुमति है क्योंकि मानक केवल न्यूनतम लगाता है। अन्य कंपाइलर एनम के आकार को नियंत्रित करने के लिए एक्सटेंशन का उपयोग करते हैं।

+0

मुझे लगता है कि अधिकांश सीपीयू आर्किटेक्चर के लिए देशी आकार का उपयोग करते हैं। 32-बिट गठबंधन डेटा अधिकांश 32-बिट CPUs के लिए पुनर्प्राप्त करने के लिए तेज़ है, इसलिए अधिकांश प्रकार 32 बिट्स के गुणक के रूप में समाप्त होते हैं। – gbjbaanb

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