Ist es sicher, dass STL-Vektor-Speicher ist immer zusammenhängend zu übernehmen?

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

  •  05-07-2019
  •  | 
  •  

Frage

Wenn Sie einen STL-Vektor haben, die Größe geändert wurde, ist es sicher, die Adresse des Elements 0 und übernimmt den Rest des Vektors zu nehmen, wird im Speicher folgen?

z.

vector<char> vc(100);
// do some stuff with vc
vc.resize(200);
char* p = &vc[0];
// do stuff with *p
War es hilfreich?

Lösung

Ja, das ist eine gültige Annahme (*).

Von dem C ++ 03-Standard (23.2.4.1):

  

Die Elemente eines Vektors gespeichert werden   zusammenhängend bedeutet, dass, wenn v a   Vektor, wobei T einig   Geben Sie andere als Bool, dann gehorcht   die Identität & v [n] == & v [0] + n für   alle 0 <= n

(*) ... aber achten Sie auf das Array (entkräften alle Zeiger und Iteratoren) neu zugewiesen werden, nachdem Elemente ihm hinzufügen.

Andere Tipps

Die C ++ 03-Standard hinzugefügt Formulierung deutlich zu machen, dass Vektorelemente müssen zusammenhängend sein.

C ++ 03 23.2.4 Absatz 1 enthält folgende Sprache, die ist nicht in dem C ++ 98-Standard-Dokument:

  

Die Elemente eines vector gespeichert   zusammenhängend bedeutet, dass, wenn v a   vector<T, Allocator> wo T ist   einiger anderer Typ als bool, dann   gehorcht der Identität &v[n] == &v[0] + n für alle 0 <= n < v.size().

Herb Sutter spricht über diese Änderung in einem seiner Blogeinträge, Cringe nicht: Vektoren sind garantiert zusammenhängenden sein:

  

... Kontiguität ist in der Tat ein Teil der   Vektor-Abstraktion. Es ist so wichtig,   in der Tat, dass, wenn es entdeckt wurde,   dass der C ++ 98-Standard hat nicht   vollständig garantieren Kontiguität, die   C ++ 03-Standard wurde geändert, um   ausdrücklich die Garantie hinzuzufügen.

Speicher ist immer zusammenhängende, aber es kann als der Vektor der Kapazität bewegen geändert wird.

Wenn Sie einen Zeiger, Bezug genommen, oder Iterator auf das Element Null (oder ein beliebiges Element) vor einer Kapazität Wechselvorgang wird für ungültig erklärt und müssen neu zugewiesen werden.

std::vector garantiert, dass die Elemente in einer angrenzenden Array gespeichert sind, und sind daher der bevorzugte Ersatz von Arrays und können auch verwendet werden mit plattformabhängigen Low-Level-Code-Schnittstelle (wie Win32-API-Aufrufe). Um einen Zeiger auf die Array Verwendung zu erhalten:

&myVector.front();

ja.

es sollte alway angrenzen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top