Heim >Backend-Entwicklung >C++ >Garantiert der C-Standard die Größe und das Speicherlayout von „std::array'?

Garantiert der C-Standard die Größe und das Speicherlayout von „std::array'?

Barbara Streisand
Barbara StreisandOriginal
2024-11-24 10:49:12502Durchsuche

Does the C   Standard Guarantee the Size and Memory Layout of `std::array`?

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:

  • Zusätzlicher Datenspeicher: std::array könnte über den angegebenen hinaus zusätzlichen Speicher reservieren Werte, die eine Fehlererkennung ermöglichen, wenn Daten über die Grenzen des Arrays hinaus geschrieben werden.
  • Ausrichtungsunterschiede: Compiler wenden möglicherweise eine unterschiedliche Ausrichtung oder Auffüllung auf std::arrays an, insbesondere im Vergleich zu integrierten Arrays zur Unterstützung erweiterter Ausrichtungsanforderungen.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn