Vergrößern des Speicheradressraums

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Speicherverwaltung - Index

Dieser Abschnitt beschreibt, wie der Adressraum des Speichermanagers über 2 GB auf Win32 hinaus erweitert wird.

Hinweis: Die Standardgröße für den Adressraum für den Benutzermodus für eine Win32-Anwendung beträgt 2 GB, er kann aber optional auf 3 GB unter 32-Bit-Windows und auf 4 GB unter 64-Bit-Windows erweitert werden. Der Adressraum ist immer ein wenig fragmentiert. Daher ist es unwahrscheinlich, dass eine GetMem-Anforderung auf einen einzelnen zusammenhängenden Block größer als 1 GB erfolgreich sein wird – auch nicht bei einem Adressraum von 4 GB.

So aktivieren und verwenden Sie einen größeren Adressraum:

  1. Vergewissern Sie sich, dass das Betriebssystem einen größeren Adressraum unterstützt:
  2. Setzen Sie die geeignete Linker-Direktive. Das Betriebssystem muss über ein Flag im Header der ausführbaren Datei darüber informiert werden, dass die Anwendung einen Adressraum für den Benutzermodus von mehr als 2 GB unterstützt, ansonsten werden nur 2 GB bereitgestellt. Um dieses Flag zu setzen, geben Sie in der .dpr-Datei der Anwendung {$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} ein.
  3. Stellen Sie sicher, dass alle Bibliotheken und Komponenten von Fremdherstellern den größeren Adressraum unterstützen. Bei einem 2-GB-Adressraum ist das hohe Bit aller Zeiger immer 0, daher kann ein größerer Adressraum Fehler in der Zeigerarithmetik aufdecken, die zuvor keine Symptome gezeigt haben. Solche Fehler werden typischerweise verursacht, wenn Zeiger bei der Zeigerarithmetik oder bei Zeigervergleichen in Integertypen anstatt in Kardinaltypen umgewandelt werden.

Hinweis: Bei Speicher, der mit dem Speichermanager zugewiesen wird, ist gewährleistet, dass er an mindestens 8-Byte-Grenzen ausgerichtet ist. Eine 16-Byte-Ausrichtung ist hilfreich, wenn Speicherblöcke mit SSE-Anweisungen manipuliert werden, könnte aber ein Speicherverwendungs-Overhead vergrößern. Die garantierte minimale Blockausrichtung für zukünftige Zuweisungen kann mit SetMinimumBlockAlignment gesetzt werden.

Siehe auch