هل يمكنني أن أفترض أن المُخصصين لا يحتفظون بتجمع الذاكرة الخاص بهم مباشرةً (وبالتالي يمكن نسخهم)؟

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

  •  13-12-2019
  •  | 
  •  

سؤال

أنا أكتب حاوية وأرغب في السماح للمستخدم باستخدام المخصصات المخصصة، ولكن لا يمكنني معرفة ما إذا كان يجب علي تمرير المخصصات حسب المرجع أو القيمة.

هل هو مضمون (أو على الأقل افتراض معقول) أن كائن المخصص سوف يفعل ذلك لا تحتوي على تجمع الذاكرة الخاص بها مباشرةً، وبالتالي سيكون من المناسب نسخ المُخصص وتوقع أن تكون مجموعات الذاكرة الخاصة بالمخصصين متوافقة بشكل متبادل؟أو هل أحتاج دائمًا إلى تمرير المخصصات حسب المرجع؟

(لقد وجدت أن المرور حسب المرجع يضر بالأداء بعامل> 2 لأن المترجم يبدأ في القلق بشأن الاسم المستعار، لذلك يحدد ما إذا كان بإمكاني الاعتماد على هذا الافتراض أم لا.)

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

المحلول

في C ++ 11 القسم 17.6.3.5 متطلبات المخصصات [المكونات. الإبلاغ] تحدد متطلبات المخصصات المطابقة. من بين المتطلبات:

giveacodicetagpre.

ie.e. عند نسخ مصلح، يتعين على النسختين أن تكون قادرة على حذف مؤشرات بعضهم البعض.

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

ولكن مهما كان المخطط، يجب أن تكون النسخ "متوافقة مع".

تحديث

هنا هو C ++ 11 مطابقا يتوافق مع "تحسين السلسلة القصيرة". لجعلها C ++ 11 مطابقة، اضطررت إلى وضع المخزن المؤقت "الداخلي" الخارجي إلى المصلح بحيث نسخ متساوية:

giveacodicetagpre.

يمكن استخدامه مثل هذا:

giveacodicetagpre.

جميع مخصصات المشكلة أعلاه يتم رسمها من GuardaceDicetagCode المحلي الذي هو حجم 1 كيلوبايت. يجب أن تكون قادرا على اجتياز هذا المكونات حول القيمة أو بالرجوع إليها.

نصائح أخرى

يضع معيار C++ القديم متطلبات المخصص المتوافق مع المعايير:تتضمن هذه المتطلبات أنه إذا كان لديك Alloc<T> a, b, ، ثم a == b, ، ويمكنك استخدام b لإلغاء تخصيص الأشياء التي تم تخصيصها a.المخصصون هم في الأساس عديمي الجنسية.


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

فقط للإجابة على سؤالك أولا:لا، يمكنك بالتأكيد لا افترض أنه من المنطقي نسخ المُخصص الخاص بك، وقد لا يكون مُخصصك قابلاً للنسخ.

هنا 23.2.1/7 حول هذا الموضوع:

ما لم ينص على خلاف ذلك، تحصل جميع الحاويات المحددة في هذه الفقرة على الذاكرة باستخدام مُخصص (انظر 17.6.3.5).يحصل منشئو النسخ لأنواع الحاويات هذه على مُخصص عن طريق الاتصال allocator_traits<allocator_-type>::select_on_container_copy_construction على المعلمات الأولى.يحصل منشئو النقل على مُخصص من خلال بناء النقل من المُخصص التابع للحاوية التي يتم نقلها.لا يجوز الخروج من بناء النقل هذا للمخصص عبر استثناء.جميع المنشئات الأخرى لهذه الأنواع من الحاويات تأخذ Allocator& الوسيطة (17.6.3.5)، مُخصص نوع قيمته هو نفس نوع قيمة الحاوية.[ملحوظة:إذا كان استدعاء المُنشئ يستخدم القيمة الافتراضية لوسيطة المُخصص الاختيارية، فيجب أن يدعم نوع المخصص تهيئة القيمة.—ملاحظة نهائية] يتم استخدام نسخة من هذا المُخصص لأي تخصيص للذاكرة يتم إجراؤه بواسطة هؤلاء المُنشئين وبواسطة جميع وظائف الأعضاء، أثناء عمر كل كائن حاوية أو حتى يتم استبدال المُخصص.قد يتم استبدال المخصص فقط عبر المهمة أو المبادلة ().يتم إجراء استبدال المُخصص عن طريق تعيين النسخ أو نقل المهمة أو تبديل المُخصص فقط في حالة allocator_traits<allocator_type>::propagate_on_container_copy_assignment::value, allocator_traits<allocator_type>::propagate_on_container_move_assignment::value, ، أو allocator_traits<allocator_type>::propagate_on_container_swap::value صحيح ضمن تنفيذ عملية الحاوية المقابلة.لا يكون سلوك استدعاء دالة المبادلة الخاصة بالحاوية محددًا إلا إذا كانت الكائنات التي يتم تبديلها تحتوي على مخصصات تقارن بشكل متساوي أو allocator_traits<allocator_type>::propagate_on_container_swap::value صحيح.في جميع أنواع الحاويات المحددة في هذا البند، العضو get_allocator() تقوم بإرجاع نسخة من المُخصص المستخدم لإنشاء الحاوية، أو، إذا تم استبدال هذا المُخصص، نسخة من الاستبدال الأحدث.

انظر أيضًا توثيق std::allocator_traits للحصول على ملخص.

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