Sind std :: vector Elemente im physischen Speicher zusammenhängend?

7

Meine Frage ist ähnlich wie bei etwas anderes fragen.

Es ist klar, dass es möglich ist, die Adresse des ersten std::vector -Elements als ein C -Typ-Array zu verwenden. Das bedeutet, dass std::vector -Elemente im virtuellen Speicher zusammenhängend sind. Wenn jedoch physischer Speicher fragmentiert ist, ist std::vector möglicherweise tatsächlich in viele Teile im physischen Speicher aufgeteilt.

Meine Frage ist: Sind std::vector Elemente zusammenhängend im physischen Speicher (sowie im virtuellen Speicher)?

    
ST3 30.08.2013, 20:24
quelle

3 Antworten

14

Der Speicher, der zum Speichern der Daten in einem Vektor verwendet wird, muss sich an zusammenhängenden Adressen befinden, da diese Adressen für den Code sichtbar sind.

In einem typischen Fall auf den meisten modernen CPUs / Betriebssystemen bedeutet dies, dass die virtuellen Adressen zusammenhängend sein müssen. Wenn diese virtuellen Adressen eine Seitengrenze überschreiten, besteht eine gute Chance, dass die physischen Adressen nicht mehr zusammenhängend sind.

Ich sollte hinzufügen, dass dies nur selten ein Hauptanliegen ist. Moderne Systeme unterstützen zumindest eine solche fragmentierte Speichernutzung in vielen Fällen bis hin zur Hardwareebene. Zum Beispiel enthalten viele Netzwerk- und Festplatten-Controller eine "Scatter / Gather" -Fähigkeit, wobei das OS die Seitentabellen verwendet, um die virtuellen Adressen für den Puffer in physikalische Adressen zu übersetzen, und dann eine Anzahl physikalischer Adressen direkt an den Controller liefert, der dann sammelt die Daten von diesen Adressen, wenn sie vom Speicher zum Peripheriegerät übertragen werden oder die Daten zu diesen Adressen "streuen", wenn sie von Peripherie zu Speicher übertragen werden.

    
Jerry Coffin 30.08.2013, 21:54
quelle
6

Nein, es gibt keine Garantie, dass Ihnen zusammenhängender physischer Speicher in der abstrakten Maschine von C ++ zur Verfügung gestellt wird. Abstraktionen und Hardware unterhalb von malloc können frei verfügbaren Speicher verwenden.

Nur Ihre gezielte Implementierung könnte eine solche Garantie geben, aber der Sprache / dem Modell ist das egal. Es verlässt sich auf das System, um seine Arbeit zu erledigen.

    
justin 30.08.2013 21:56
quelle
1

Die Zuordnung von virtuellem zu physikalischem Speicher wird größtenteils von der CPU übernommen, jedoch mit Kernel-Unterstützung. Ein Benutzerlandprozess kann nicht wissen, was diese Zuordnung ist: Ihr Programm, unabhängig von der Programmiersprache, behandelt ausschließlich virtuelle Speicheradressen. Sie können nicht erwarten, und es gibt auch keine Möglichkeit, herauszufinden, ob zwei benachbarte virtuelle Speicheradressen, die eine Seitengrenze überspannen, im physischen Speicher benachbart sind, so dass es absolut keinen Grund gibt, sich darüber Gedanken zu machen.

    
Emmet 30.08.2013 22:42
quelle