ناقلات نظيفة كل حلقة التكرار. ما هي الطريقة الأكثر كفاءة الذاكرة؟

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

سؤال

ولدي سؤال حول الأمراض المنقولة جنسيا :: ناقلات.

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

وأي مما يلي هو الأفضل:

for ( ... ) {
  std::vector<Type> my_vector;
  my_vector.reserve(stuff_count);
  // Do stuff , and append stuff to my_vector.
}

وأو هذا:

std::vector my_vector;
for ( ... ) {
  my_vector.clear();
  my_vector.reserve(stuff_count);
  // Do stuff , and append stuff to my_vector.
}

ومن فضلك قل لي ما هو أفضل، أو إذا كان هناك طريقة أفضل للقيام الاشياء.

وشكرا جزيلا مقدما!

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

المحلول

ومع الخيار الأول يمكنك تخصيص المخزن المؤقت للناقلات على كل التكرار - وهذا عادة مكلفة للغاية. مع البديل الثاني الذي تخصيص إلا لماما. الخيار الثاني هو الأفضل منذ السرعة هي أولوية بالنسبة لك.

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

نصائح أخرى

<اقتباس فقرة>   

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

وحاول وتتصرف مثل مهندس لا عراف. إنشاء اختبار، وقياس الفرق.

وثانية واحدة يمكن أن يكون أسرع قليلا، ولكن أجد أول واحد أكثر نظافة.

وأما الاختلافات في رمز تافهة، لماذا لا يختبر كلا النهجين ومعرفة الأفضل للتطبيق الخاص بك معين؟

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

std::vector<Type> my_vector(size);
for (...)
{
  int index = 0;
  // Do stuff
  my_vector[index] = some_value;
}

و(تحذير: كود مجربة)

<اقتباس فقرة>   

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

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

وثانية واحدة واستخدام الذاكرة القصوى من جميع استخدامات أنه خلال الحلقة، أي الحد الأقصى لحجم أنواع stuff_count. std::vector::clear() لا يعني بالضرورة الذاكرة مجانا . أي في حالة استدعاء std::vector::capacity() قبل وبعد std::vector::clear() مستوى تنفيذ المطابقة يمكن إرجاع نفس القيمة.

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

std::vector<type>().swap(my_vector);
my_vector.reserve(stuff_count); 

وأو الحل الأول، منذ التأثير الكلي سوف تكون هي نفسها.

إذا كنت بحاجة إلى القيام بالكثير من إلحاقها استخدام STD :: صف مزدوج الذيل بدلا من الأمراض المنقولة جنسيا :: ناقلات ومجرد استخدام "push_back".

وماذا عن؟

std::vector<DataType> my_vector;
my_vector.resize(sizeof(yourData));
memcpy(reinterpret_cast<char*>(&my_vector), &yourData, sizeof(yourData));
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top