Ordnet new [] Speicher zusammenhängend zu?

8

Wenn ich das neue Schlüsselwort [] (oder new-operator) verwende, weist es Speicher zusammenhängend zu?

%Vor%

Ich meine, gibt es eine Garantie, dass arr [0] und arr [1] eng beieinander liegen, und ich kann durch arr Zeigerschritte verwenden? Wenn ja, speichert dieses Verhalten mit Strukturen und Klassen anstelle von int?

    
Alex Larionov 15.09.2017, 14:23
quelle

2 Antworten

11

Der C ++ Standard absolut garantiert dies.

arr[0] bis bis arr[9] sind zusammenhängend und es ist kein Padding zwischen Elementen erlaubt. Die Zeigerarithmetik ist in der zugewiesenen Region gültig. Sie können einen Zeiger auf arr + 10 setzen, aber nicht deneferenzieren.

Dies gilt für die Klasse any . Die Menge an Speicher, die pro Element zugewiesen wird, ist sizeof(Y) , wobei Y der Klassen- oder einfache alte Datentyp ist.

    
Bathsheba 15.09.2017, 14:24
quelle
2

Ja, die Elemente befinden sich garantiert im konsekutiven Speicher (unabhängig von ihrem Typ). Wenn Sie new[] aufrufen, erhalten Sie ein Array und die einzige Möglichkeit, auf die Elemente zuzugreifen, ist die Zeigerarithmetik.

Überlegen Sie, was arr[i] eigentlich bedeutet:

%Vor%

ist wirklich nur eine Kurzform von

%Vor%

Ein skurriler Nebeneffekt davon ist, dass für ein Array arr und einen Index i

gilt %Vor%

ist genau dasselbe wie arr[i] (obwohl Sie dies nur schreiben würden, wenn Sie Ihre Mitarbeiter verwirren wollen).

Beachten Sie jedoch, dass [] überladen sein kann und in diesem Fall alles ausführen kann, was die Implementierung auswählt. Dennoch wird auch ein Array, das mit new[] mit einem überladenen oeprator[] belegt ist, seine Elemente im fortlaufenden Speicher haben.

    
user463035818 15.09.2017 14:34
quelle

Tags und Links