Wird die Größe von std::array durch den Standard erzwungen?
In C 11 ist std::array garantiert zusammenhängend Speicher und eine Leistung, die ein normales Array übertrifft oder diesem gleichkommt. Es bleibt jedoch die Frage: Definiert der Standard explizit die Größe und das Speicherlayout von std::array?
Untersuchung der Anforderungen des Standards
Der Standard definiert std:: Array als Aggregat, das mit der folgenden Syntax initialisiert werden kann:
std::array<T, N> a = { initializer-list };
Als Aggregat kann std::array nicht verwendet werden Konstruktoren zum Konvertieren von Daten aus der Initialisierungsliste. Dies bedeutet, dass das Array in erster Linie die Werte selbst speichert.
Mögliche Abweichungen vom erwarteten Verhalten
Technisch gesehen verbietet der Standard bestimmte potenzielle Abweichungen nicht:
Compiler Variationen
Trotz der Mehrdeutigkeit des Standards deutet die praktische Verwendung in großen Compilern wie GNU und Intel darauf hin, dass die Größe und das Speicherlayout von std::array denen regulärer Arrays entsprechen.
std::vector< std::array<int, N> > x(M); typedef int (*ArrayPointer)[N]; ArrayPointer y = (ArrayPointer) &x[0][0]; // Safe multidimensional array-like usage
Das stimmt Es ist wichtig zu beachten, dass dieser Code zwar wie erwartet funktioniert, es jedoch keine Garantie dafür gibt, dass alle Implementierungen diesem Muster folgen. Daher ist es nicht ratsam, sich in geschäftskritischem Code auf dieses Verhalten zu verlassen.
Das obige ist der detaillierte Inhalt vonGarantiert der C-Standard die Größe und das Speicherlayout von „std::array'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!