هل تريد تعطيل قيمة تعبئة المتجهات عند تغيير الحجم؟ج ++

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

  •  03-07-2019
  •  | 
  •  

سؤال

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

أعلم أن تغيير الحجم يضبط القيمة على fillValue (دائمًا 0؟).لذلك ستكون هناك تهيئة لا طائل من ورائها (نأمل أن تكون أقل من ميغابايت في كل مرة) 60 مرة في كل ثانية.هل هناك طريقة لتعطيل البدء عند تغيير الحجم؟

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

المحلول

في الأساس لا.يتم إنشاء العناصر الموجودة في المتجه بشكل افتراضي عند تغيير حجمها (بالنسبة لعدد صحيح يؤدي هذا إلى 0).

بافتراض أنك تستخدم Reserve() للتأكد من أن resize() لا يخصص الذاكرة، فلن أقلق بشأن هذا إلا إذا ثبت أنها مشكلة في الأداء لاحقًا.

إذا كنت قلقًا، فقد ترغب في التفكير في استخدام مصفوفة عادية وتخزين عدد العناصر في متغير منفصل.هذا سيعطيك أفضل أداء.

تحديث:

سأل جون:

هل المُنشئ مضمونًا حقًا الصفر في تلك الذاكرة؟اعتقدت أن هذا غير محدد؟

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

على سبيل المثال

int a;         // uninitialized
int b = int(); // initialized to 0

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

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