2 Stimmen

Wie kann ich ein 2-Gigabyte-Block von Speicher in C++ zuweisen?

Der Speicher, den ich versuche zuzuweisen, ist nicht riesig oder so. ich kann nur nicht zuweisen 1,5 bis 1,7 Gigabyte des ansteckenden Speichers. Von dem, was ich weiß, Windows gibt Ihnen 2 Gigabyte virtuellen Speicherplatz in Ihrer Anwendung zu verwenden. so, ein Aufruf wie malloc(1500*1024*1024) ist nicht völlig verrückt. ich versuchte malloc ,new[], VirtualAlloc alle nicht funktionieren.

Gibt es etwas, das ich hier übersehe? Jemand hat mir gesagt, dass es etwas mit dem physischen Speicher zu tun hat. Ich habe das total abgelehnt, denn warum wurde der virtuelle Raum, Adressübersetzungstabellen und TLBs erfunden, wenn ich physischen Speicher zuweise.

Wenn ich 1,5 Gig auf einer Maschine mit 256 Megabyte Ram zugewiesen habe und versuche, darauf zuzugreifen, sollte das System dann nicht stürzen, aber funktionieren?

3voto

psmears Punkte 23659

Verschiedene Versionen von Windows haben unterschiedliche Speicherbeschränkungen . Wenn Sie eine 32-Bit-Version verwenden, müssen Sie möglicherweise die 4GB Tuning-Techniken mehr als 2 GB zuzuweisen.

1voto

Ira Baxter Punkte 91118

Wenn Sie eine 32-Bit-Version von Windows verwenden, haben Sie maximal 2 GB virtuellen Speicherplatz. Ihre kompilierten Programme und die C/C++-Laufzeitbibliotheken verbrauchen jeweils einen Teil davon, zusammen mit vorab zugewiesenen Code- und Datensegmenten. Wenn Sie ein 32-Bit-Windows verwenden, haben Sie weniger Speicherplatz als Sie denken. Ich stimme zu, dass 1,5 GB nicht unvernünftig klingen, aber dann würden Sie denken, dass MS-Produkte auch nicht unvernünftig sind, oder?

Versuchen Sie es mit kleineren Stücken (z.B. 1Gb), um die Vernunft zu prüfen; ich vermute, das wird gelingen. Und versuchen Sie große Zuweisungen auf einem 64-Bit-System, wo es keine praktische Obergrenze gibt.

0voto

KenE Punkte 1795

Verwenden Sie ODBC? Die ODBC-DLLs in 32-Bit-Windows scheinen sich an einer ungünstigen Stelle in den virtuellen Adressraum einzufügen, wodurch große Zuweisungen wie die Ihre fehlschlagen. Eine Abhilfe besteht darin, Ihre Anwendung so zu konfigurieren, dass das Laden der ODBC-DLLs verzögert wird, und dann sicherzustellen, dass Sie Ihren großen Brocken zuweisen, bevor Sie etwas aufrufen, das ODBC verwendet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X