هل من الآمن افتراض أن تخزين ناقلات STL متجاور دائمًا؟

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

  •  05-07-2019
  •  | 
  •  

سؤال

إذا كان لديك متجه STL تم تغيير حجمه، فهل من الآمن أخذ عنوان العنصر 0 وافتراض أن بقية المتجه سيتبعه في الذاكرة؟

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

vector<char> vc(100);
// do some stuff with vc
vc.resize(200);
char* p = &vc[0];
// do stuff with *p
هل كانت مفيدة؟

المحلول

نعم، هذا افتراض صحيح (*).

من معيار C++03 (23.2.4.1):

يتم تخزين عناصر المتجه بشكل متجاورة ، وهذا يعني أنه إذا كان V هو المتجه حيث يكون T نوعًا آخر غير منطقي ، فإنه يطيع الهوية و V [N] .مقاس().

(*)...لكن احذر من إعادة تخصيص المصفوفة (إبطال أي مؤشرات ومكررات) بعد إضافة عناصر إليها.

نصائح أخرى

ووC ++ القياسية 03 الصياغة إضافة إلى أن توضح أن يجب أن تكون عناصر مكافحة ناقلات متجاورة.

وC ++ 03 23.2.4 الفقرة 1 تحتوي على العبارة التالية والتي هي <م> لا في وثيقة موحدة C ++ 98:

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

ويتم تخزين عناصر vector   متاخم، وهذا يعني أنه إذا v هو   vector<T, Allocator> حيث T هو   بعض الأنواع الأخرى من bool، ثم   يطيع &v[n] == &v[0] + n الهوية لجميع 0 <= n < v.size().

وعشب سوتر يتحدث عن هذا التغيير في واحدة من مداخل بلوق، <وأ href = "http://herbsutter.wordpress.com/2008/04/07/cringe-not-vectors-are-guaranteed-to-be -contiguous / "يختلط =" noreferrer "> ارتد لا: ويضمن المتجهات لتكون متجاورة :

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

... التواصل هو في الواقع جزء من   ناقلات التجريد. انه من المهم جدا،   في الواقع، أنه عندما تم اكتشافه   أن مستوى C ++ 98 لم لا   ضمان تماما التواصل، و   تم تعديل C ++ القياسية 03 ل   إضافة صراحة الضمان.

والتخزين هو دائما متجاورة، لكنها قد تحرك كما يتم تغيير قدرة ناقلات ل.

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

وضمانات std::vector أن يتم تخزين العناصر في مجموعة متجاورة، وبالتالي هو استبدال المفضل من المصفوفات ويمكن أن تستخدم أيضا للتواصل مع رمز مستوى منخفض تعتمد على منصة (مثل المكالمات API Win32 و). للحصول على مؤشر إلى استخدام مجموعة:

&myVector.front();

نعم.

ويجب أن تكون دوما متجاورة

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