سؤال

تحقق من هذا الاقتباس من هنا, نحو الجزء السفلي من الصفحة.(أعتقد ونقلت عن التعليق consts تنطبق على invariants وكذلك)

والتعدادات تختلف من consts في أنها لا تستهلك أي مساحة في النهائي أنتج كائن/المكتبة/للتنفيذ ، بينما consts القيام به.

لذلك على ما يبدو value1 سوف تشعر بالانتفاخ القابل للتنفيذ ، في حين value2 يتم معاملة حرفية و لا تظهر في ملف الكائن.

const int value1 = 0xBAD;
enum int value2 = 42;

مرة أخرى في C++ أنا دائما أفترض هذا كان لأسباب الإرث ، و القديمة المجمعين لا أمثل بعيدا عن الثوابت.ولكن إذا كان هذا لا يزال صحيحا في د ، يجب أن يكون هناك سبب أعمق وراء ذلك.أحد يعرف لماذا ؟

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

المحلول

مثلما هو الحال في C++ ، enum في د يبدو أن "الحفظ صحيح الحرفي" (تحرير:مذهلة, D2 حتى تدعم يطفو سلاسل).لها التعداد مكان.فهي مجرد غير مادي مثل القيم دون هوية.

وضع enum هو جديد في D2.أولا بتعريف متغير جديد.وليس lvalue (بحيث يمكنك أيضا أن تأخذ عنوانه).وهو

enum int a = 10; // new in D2

مثل

enum : int { a = 10 }

إذا كنت يمكن أن تثق بي الفقراء D المعرفة.لذلك ، a هنا ليس lvalue (لا موقع و لا يمكنك أن تأخذ عنوانه).Const, ومع ذلك ، وقد عنوان.إذا كان لديك العالمية (لست متأكدا إذا كان هذا هو الحق د المصطلحات) const متغير, مترجم عادة لا يمكن تحسين بعيدا, لأنه لا يعرف ماذا وحدات يمكن الوصول إلى هذا المتغير أو يمكن أن تأخذ عنوانه.لذلك يجب تخصيص التخزين لذلك.

أعتقد إذا كان لديك المحلية const, المترجم لا يزال تحسين بعيدا كما هو الحال في C++, لأن المترجم يعرف من خلال النظر في نطاق ما إذا كان أي شخص مهتم في العنوان أو ما إذا كان الجميع يأخذ قيمته.

نصائح أخرى

الفعلي السؤال ؛ لماذا التعداد/const هو نفسه في د كما في C++;يبدو أن إجابة.للأسف لا يوجد سبب وجيه لهذا الخيار على الإطلاق.وأعتقد أن هذا كان مجرد تأثير جانبي غير مقصود في C++ التي أصبحت بحكم الواقع نمط.في نفس النمط ، والتر مشرق قررت أنه ينبغي أن يتم ذلك كما هو الحال في C++ مثل تلك القادمة من هذا المكان أن ندرك ماذا تفعل ...في الواقع, قبل هذا بدلا IMHO سخيفة القرار الكلمة يعبر كانت تستخدم بدلا من التعداد لهذا usecase.

أعتقد جيدة مترجم/رابط ينبغي أن تزال إزالة المستمر.إنه فقط مع التعداد ، انها فعلا مضمونة في المواصفات.الفرق هو في المقام الأول مسألة دلالات.(كما نضع في اعتبارنا أن 2.0 ليست كاملة حتى الآن)

الغرض الحقيقي من enum يجري توسيع نحويا لدعم واحد يعبر عن ثوابت ما أفهمه هو أن لا Clugston ، د قالب المعلم كان يفعل بعض الأشياء المجنونة مع القوالب.لقد ظل يعمل في بناء مرات, سخيف مترجم استخدام الذاكرة ، الخ.لأن المترجم أبقى إنشاء البيانات الداخلية strucutres على const المتغيرات.واحد الشيء الرئيسي حول const/المتغيرات ثابتة مقارنة enums هو أن const/ثابتة المتغيرات lvalues و يمكن أن يكون عنوان المتخذة.وهذا يعني أن هناك المزيد من النفقات العامة المترجم.هذا عادة لا يهم, ولكن عندما كنت تنفيذ معقدة حقا ترجمة في الوقت metaprograms ، حتى إذا const المتغيرات هي الأمثل بعيدا, هذا لا يزال كبيرا النفقات العامة في وقت الترجمة.

يبدو أن التعداد سوف تكون القيمة المستخدمة "مضمن" في التعبير حيث const سوف تتخذ في الواقع تخزين أي تعبير الرجوع وسوف يتم تحميل قيمة من ذاكرة التخزين.

هذا الصوت يشبه الفرق بين const مقابلللقراءة فقط في C#.الأول هو الترجمة الوقت ثابت و هو في وقت لاحق وقت التشغيل المستمر.هذا بالتأكيد تتأثر الإصدارات من الجمعيات (منذ جمعيات الرجوع للقراءة فقط سوف تتلقى نسخة في وقت الترجمة و لن تحصل على تغيير في القيمة إذا كان المشار إليه الجمعية أعيد بناؤها مع قيمة مختلفة).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top