Ich habe keinen besseren Weg gefunden, meine Frage so zu formulieren: Ist die Ausgabe unten immer wahr? ist das tragbar?
%Vor% Was ist, wenn anstelle von vector
, points
ein rohe Array definiert wurde? Ist die Ausgabe immer noch wahr?
Für std::vector
sagt [vector.overview] / 1 (N3337):
Die Elemente eines Vektors werden zusammenhängend gespeichert, dh wenn
v
einvector<T, Allocator>
ist, wobeiT
ein anderer Typ alsbool
ist, dann wird die Identität&v[n] == &v[0] + n
für alle0 <= n < v.size()
übernommen.
Also, das Verhalten Ihres Programms ist portabel und gut definiert.
Bei Arrays lautet [dcl.array] / 1:
Ein Objekt vom Typ Array enthält eine zusammenhängend zugeordnete, nicht leere Menge von
N
Unterobjekten vom TypT
.
Dies ist nicht ganz so explizit wie das vector
Zitat, aber die Mitverwendung des Wortes "zusammenhängend" weist auf die Tatsache hin, dass die std::vector
Speicheridentität auch für Arrays gilt.
Ja, eine der Voraussetzungen für den Vektor ist, dass seine Elemente zusammenhängend gespeichert werden müssen.
Von n2798:
23.2.6 Klassenvorlagenvektor [Vektor]
1 Ein Vektor ist ein Sequenzcontainer, der einen wahlfreien Zugriff unterstützt Iteratoren. Zusätzlich unterstützt es (amortisierte) konstante Zeit einfügen und Löschoperationen am Ende; einfügen und löschen in der Mitte nehmen lineare Zeit. Storage-Management wird automatisch behandelt, obwohl Hinweise kann gegeben werden, um die Effizienz zu verbessern. Die Elemente eines Vektors sind zusammenhängend gespeichert, was bedeutet, dass, wenn v ein Vektor ist, wo T etwas ist type anders als bool, dann gehorcht es der Identität & amp; v [n] == & amp; v [0] + n für alle 0 & lt; = n & lt; v.größe ().
Tags und Links c++ language-lawyer