عند استخدام المحكمة bitsets بدلا من فصل المتغيرات ؟

StackOverflow https://stackoverflow.com/questions/20787

  •  09-06-2019
  •  | 
  •  

سؤال

في حالة ما يكون أكثر ملاءمة بالنسبة لي لاستخدام bitset (STL حاوية) لإدارة مجموعة من الأعلام بدلا من جعلهم أعلن عدد من فصل (منطقي) المتغيرات ؟

وسوف تحصل على مكاسب كبيرة في الأداء إذا كنت تستخدم bitset 50 الأعلام بدلا من استخدام 50 منفصلة منطقي المتغيرات ؟

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

المحلول

حسنا, 50 bools كما bitset سوف يستغرق 7 بايت ، في حين أن 50 bools كما bools سوف تأخذ 50 بايت.في هذه الأيام التي ليس حقا صفقة كبيرة ، وذلك باستخدام bools هو على الارجح ما يرام.

ومع ذلك ، مكان واحد bitset قد يكون مفيدا إذا كنت بحاجة إلى تمرير تلك bools حولها الكثير, خاصة إذا كنت بحاجة إلى العودة مجموعة من وظيفة.باستخدام bitset لديك أقل من البيانات التي يمكن نقلها من مكان على المكدس للعائدين.ثم مرة أخرى, هل يمكن أن مجرد استخدام الحكام بدلا من ذلك بل أقل البيانات تمر من حولها.:)

نصائح أخرى

الأمراض المنقولة جنسيا::bitset سوف تعطيك نقاط اضافية عند الحاجة إلى تسلسل / إلغاء تسلسل ذلك.يمكنك كتابة فقط إلى تيار أو قراءة من تيار معها.ولكن من المؤكد منفصلة bools ستكون أسرع.أنها هي الأمثل لهذا النوع من الاستخدام بعد كل شيء ، بينما bitset هو الأمثل الفضائية لا تزال تعمل مكالمات المعنية.فإنه لن يكون أسرع من فصل bools.

Bitset

  • جدا فعالة الفضاء
  • أقل كفاءة بسبب بت تافه
  • يوفر تسلسل / دي-تسلسل مع op<< و op>>
  • كل بت معبأة معا:سيكون لديك الأعلام في مكان واحد.

منفصلة bools

  • سريع جدا
  • Bools ليست معبأة معا.أنها سوف تكون عضوا في مكان ما.

تقرر على الحقائق.انا شخصيا استخدم std::bitset بعض وليس الأداء الحاسمة ، استخدام bools إذا كنت إما قليلة فقط bools (وبالتالي إنها نظرة عامة قادرة) ، أو إذا كنت في حاجة إلى أداء إضافي.

ذلك يعتمد على ما تعنيه 'كسب الأداء'.إذا كنت بحاجة فقط 50 منهم ، وكنت غير منخفض على الذاكرة ثم فصل bools هو تقريبا دائما خيارا أفضل من bitset.أنها سوف تتخذ المزيد من الذاكرة ، ولكن bools سوف يكون أسرع بكثير.Bitset عادة ما يكون تنفيذها مجموعة من رجات (إن bools معبأة في تلك رجات).لذا فإن أول 32 bools (bits) في bitset سوف تأخذ فقط حتى واحد 32bit الباحث ، ولكن قراءة كل قيمة لديك للقيام ببعض عمليات أحادي المعامل أول قناع من جميع القيم كنت لا تريد.E. g.لقراءة 2 بت من bitset, أنت بحاجة إلى:

  1. العثور على الباحث الذي يحتوي على بت تريد (في هذه الحالة ، هو الباحث الأول)
  2. المعامل و أن الباحث مع '2' (أيقيمة & 0x02) لمعرفة ما إذا تم تعيين بت

ومع ذلك ، إذا كانت الذاكرة هي عنق الزجاجة لديك الكثير من bools باستخدام bitset يمكن أن معنى (على سبيل المثالإذا كنت تستهدف منصة الهاتف المحمول أو بعض الدول مشغول جدا خدمة ويب)

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

إعادة @Wilka:

في الواقع, bitsets يدعمها C/C++ في الطريقة التي لا تتطلب منك أن تفعل الخاصة بك اخفاء.أنا لا أتذكر بالضبط الجملة, ولكن هو شيء من هذا القبيل:

struct MyBitset {
  bool firstOption:1;
  bool secondOption:1;
  bool thirdOption:1;
  int fourBitNumber:4;
};

يمكنك الرجوع إلى أي قيمة في البنية فقط باستخدام الرموز نقطة ، والحق الأمور:

MyBitset bits;
bits.firstOption = true;
bits.fourBitNumber = 2;

if(bits.thirdOption) {
  // Whatever!
}

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

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