سؤال

على سبيل المثال إذا كان لدي التعداد مع اثنين من الحالات ، لا تجعل تأخذ ذاكرة أكثر من منطقية?اللغات:Java, C++

هل كانت مفيدة؟

المحلول

في جافا ، enum هو كامل في مهب الدرجة:

لغة البرمجة جافا أنواع التعداد هي أقوى بكثير من نظيراتها في اللغات الأخرى.على التعداد إعلان يحدد فئة (يسمى نوع التعداد).التعداد الدرجة الجسم يمكن أن تشمل أساليب أخرى المجالات.

من أجل معرفة الحجم الفعلي من كل enum, لنجعل الفعلي enum ودراسة محتويات class الملف يخلق.

دعونا نقول لدينا ما يلي Constants التعداد الدرجة:

public enum Constants {
  ONE,
  TWO,
  THREE;
}

تجميع أعلاه enum وتفكيك الناتجة class الملف مع javap يعطي التالية:

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 {};
}

التفكيك يدل على أن كل مجال من enum هو مثيل Constants enum فئة.(مزيد من التحليل javap سوف تكشف عن أن كل حقل يتم تهيئة طريق إنشاء كائن جديد من خلال الاتصال new Constants(String) منشئ في ثابت التهيئة كتلة.)

ولذلك نستطيع أن نقول أن كل enum الميدانية أن نخلق سوف تكون على الأقل بقدر من النفقات العامة من خلق كائن في JVM.

نصائح أخرى

في جاوة ، وينبغي أن يكون هناك سوى حالة واحدة من كل القيم من التعداد في الذاكرة.في إشارة إلى التعداد ثم يتطلب فقط لتخزين تلك الإشارة.التحقق من قيمة التعداد فعالة مثل أي الأخرى المقارنة المرجعية.

أنت فقط تقلق بشأن هذا عند تخزين كميات كبيرة من enums.جافا, كنت قد تكون قادرة على استخدام EnumSet في بعض الحالات.ويستخدم قليلا ناقلات داخليا جدا مساحة فعالة وسريعة.

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

bool قد يكون تنفيذها في بايت واحد ، ولكن عادة في الهيكل سيكون محاطا العناصر الأخرى التي قد المواءمة بين متطلبات هذا يعني أن منطقية سيكون فعليا الاحتلال على الأقل مساحة كبيرة كما int.

المعالجات الحديثة تحميل البيانات من الذاكرة الرئيسية ككل ذاكرة التخزين المؤقت الخط ، 64 بايت.الفرق بين التحميل بايت واحد من L1 cache و تحميل أربعة بايت لا يكاد يذكر.

إذا كنت تحاول تحسين ذاكرة التخزين المؤقت خطوط عالية جدا-أداء التطبيق ، ثم قد تقلق حول كيفية كبيرة التعداد ، ولكن عموما أود أن أقول أنها أكثر وضوحا لتحديد التعداد من استخدام منطقية.

في جافا ، سوف يستغرق المزيد من الذاكرة.في C++, أنها لن تتخذ أي الذاكرة مما هو مطلوب المستمر من نفس النوع (إنه تقييمها في وقت التحويل البرمجي و لا المتبقية أهمية في وقت التشغيل).في C++, وهذا يعني أن النوع الافتراضي لإجراء التعداد سوف تشغل نفس الحيز int.

في ISO C++ ليس هناك أي التزام على التعداد أن يكون أكبر من أكبر العداد يتطلب.على وجه الخصوص ، enum {TRUE, FALSE} قد sizeof(1) حتى عندما sizeof(منطقي)==sizeof(int).هناك ببساطة أي شرط.بعض المجمعين جعل enums نفس حجم int.هذا هو مترجم ميزة الذي يسمح لأن معيار يفرض الحد الأدنى.غيرها من المجمعين استخدام ملحقات التحكم في حجم التعداد.

printf("%d", sizeof(enum));

في C++ وهو التعداد هو عادة نفس الحجم كما int.وقال أنه ليس من غير المألوف بالنسبة المجمعين إلى توفير تبديل سطر الأوامر للسماح حجم التعداد أن يكون أصغر من الحجم الذي يناسب مجموعة من القيم المحددة.

لا enum هي عموما نفس حجم int, نفس منطقية.

إذا كان التعداد سوف يكون من أي وقت مضى حالتين فقط ، بل باستخدام منطقية بدلا من ذلك قد يكون فكرة أفضل (حجم الذاكرة والأداء الاستخدام/منطق), حتى أكثر في جاوة.
إذا كنت تتساءل عن الذاكرة التكلفة ، قد يعني كنت تخطط لاستخدام الكثير منهم.في جافا يمكنك استخدام BitSet الطبقة ، أو على نطاق أصغر في كل من اللغات يمكنك التلاعب بت مع جميع العمليات.

sizeof(enum) يعتمد على ما لديك في التعداد.كنت مؤخرا في محاولة للعثور على حجم ArrayList() مع منشئ افتراضي params ولا الكائنات المخزنة داخل (مما يعني القدرة على تخزين 10).اتضح أن ArrayList ليست كبيرة جدا < 100 بايت.

لذا, sizeof(enum) لفترة بسيطة جدا التعداد يجب أن تكون أقل من 10 بايت.يمكنك كتابة برنامج صغير ، تعطي كمية معينة من الذاكرة ومن ثم محاولة تخصيص enums.يجب أن تكون قادرة على معرفة ذلك(هكذا وجدت ذاكرة ArrayList)

BR ،
~A

في C/C++ وهو التعداد سيكون بنفس حجم int.

مع دول مجلس التعاون الخليجي يمكنك إضافة السمة((معبأة)) إلى التعداد تعريف جعلها تأخذ بصمة الدنيا.إن أكبر قيمة في التعداد هو < 256 هذا سوف يكون بايت واحد, اثنين بايت إذا كان أكبر قيمة < 65536, الخ.

typedef enum {
    MY_ENUM0,
    MY_ENUM1,
    MY_ENUM2,
    MY_ENUM3,
    MY_ENUM4,
    MY_ENUM5
} __attribute__((packed)) myEnum_e;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top