C ++ تخزين البيانات الكبيرة في STD :: قائمة <> .. هل يمكنني استخدام العد المرجعي؟

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

  •  12-09-2019
  •  | 
  •  

سؤال

كيف يقوم الأشخاص عادة بإدارة نسخ قائمة بالأشياء الكبيرة حولها؟

ها هو وضعي:

حاليا لدي هذا:

typedef std::vector<float> Image;  

وأنا تخزينها في

std::list<Image> lst;

الصورة. الحجم () كبير جدا (كل ~ 3-5 ميغابايت).

أنا أبعز (نسخ) القائمة حولها.

هل هو الفهم الصحيح على الجزء الخاص بي الذي STD :: ناقل سنسخ كل عنصر حسب القيمة؟ إذا كان الأمر كذلك، فقد يكون الأداء فظيعة بعض الشيء بسبب النسخ المفرط؟

ماذا يمكنني أن أفعل لتقليل النسخ؟ يجب أن أخزن بدلا من ذلك

std::list<ImageRef> lst;

أين

typedef boost::shared_ptr<Image>   ImageRef;

?

ما هي الطريقة الأنيقة للتعامل مع هذا النوع من القضية؟

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

المحلول

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

جميع أنواع STL تستخدم قيمة دلالات القيمة: أنها نسخ محتواها. لاحظ أن المحتوى قد يكون موجودا للمؤشرات. في هذه الحالة يتم نسخ المؤشرات، وليس ما يشير إليه.

قد يكون ذلك فكرة جيدة لتمرير قائمة صورتك بالرجوع إليها. يحفظ الكثير من النسخ الذكي للمؤشرات، لذلك يوفر الكثير من إدارة العد المرجعية، وقد يوفر الكثير من الأقفال / فتح.

نصائح أخرى

اعتقد ان boost::shared_ptr الطريق هو نهج جيد، طالما أنه لا يهم أن Imageلا يتم نسخها عند نسخ القائمة. ستقوم بتقليل النسخ، لكن العد المرجعي سيؤدي أيضا إلى تنظيف الأمور لك عندما يتم تدمير القائمة الأخيرة.

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

أولا، أود

typedef std::list<Image> ImageList;

إذا كنت بحاجة فقط إلى العمل مع القائمة الواحدة، فإن التلاعب بها، وتمرير المراجع إلى ImageList نفسه. لا حاجة لنسخ أي شيء بهذه الطريقة. إذا كنت بحاجة إلى الحفاظ على القائمة الأصلية وجعل نسخا منها، فقم بزيادة :: Shared_ptr هو الطريق للذهاب.

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