Dimension von Arrays beschränkt?
-
Nexus schrieb:
Das war wohl eher zu Testzwecken; jeder will doch einmal seinen Computer mit selbst geschriebenen Programmen in die Knie zwingen

Och. Das geht einfacher. Als ich vor Jahren excel's Makro Funktione entdeckt hatte und dann noch kapiert habe, wie das so ungefährt läuft. Da war auch schon mein erste Skript Virus geboren.

-
zeusosc schrieb:
Bei mir kam eine Fehlermeldung als ich rund 1.4GB allociert hatte,.. also aufpasse

Würde gerne Wissen, wie man das mit 1.4 GB hinbekommen kann und herausfinden kann, wie kann ich so einen "genauen" Messwert herausbekommen ?
-
Ein kleines Testprogramm:
int main() { const unsigned int KILO_BYTE = 1024 * 1; const unsigned int MEGA_BYTE = 1024 * KILO_BYTE; const unsigned int GIGA_BYTE = 1024 * MEGA_BYTE; try { char* memory = new char[1 * GIGA_BYTE + 768 * MEGA_BYTE]; std::cin.get(); delete[] memory; } catch (std::bad_alloc) { std::cout << "Zu wenig Speicher!" << std::endl; } }Irgendwo bei 1,8 - 1,9 GB ist bei mir Schluss (hab 2 GB RAM). Windows braucht auch noch ein bisschen zum Überleben. Langsamer wird mein Computer trotz der allokierten 1,7 GB allerdings nicht.
Gruß
Don06
-
HEHE...
Bei meinem Rechner mit 512 MB RAM kommt eine Fehlermeldung + Warnung vom Compiler wenn ich GB als Größe angebe... Ist ja eigentlich auch ziemlich logisch ;):error C2148: Gesamtgröße des Arrays darf 0x7fffffff Bytes nicht übersteigen. warning C4307: '*': Überlauf einer ganzzahligen KonstantenScheint also nicht bei jedem zu funktionieren.
*EDIT: Habe es mit MB * 400 probiert und unten rechts im Bildschirm kam eine nette Warnung von Windows:
Nicht genügend virtueller Speicher
-
Speedy_92 schrieb:
HEHE...
Bei meinem Rechner mit 512 MB RAM kommt eine Fehlermeldung + Warnung vom Compiler wenn ich GB als Größe angebe... Ist ja eigentlich auch ziemlich logisch ;):Ne, das ist nicht logisch. Der Compiler soll dein Programm ja nur kompilieren, der achtet nicht drauf, dass es auf deiner Maschine ausführbar ist.
Hast du den Code von Don06 1:1 kopiert?Auf einem 32-Bit-Betriebssystem kann man übrigens nie mehr als 2-3 GB anfordern, weil die Zeiger nicht mehr hergeben und aller möglicher anderer Kram noch dazwischenspielt. Wenn du 1GB anforderst, aber nie etwas reinschreibst, wird so ein Block übrigens nicht "wirklich" im Speicher angelegt. Das Betriebssystem merkt sich dann nur "Program xyz möchte 1GB haben", aber effektiv bereitgestellt wird diese Menge erst, wenn dein Programm mit dem Speicher was macht (und wenn es nur 0en reinschreibt).
-
#include <iostream> int main() { const unsigned int KB = 1024; const unsigned int MB = 1024 * KB; const unsigned int GB = 1024 * MB; try { int *ptr = new int[MB * 500]; std::cout<<"Allokierung erfolgreich!"<<std::endl; std::cin.get(); delete[] ptr; } catch(std::bad_alloc) { std::cout<<"Nicht genügend Speicher! Allokierung fehlgeschlagen!"<<std::endl; } return 0; }Ist im prinzip das Gleiche, oder macht es einen Unterschied, ob ich int anstatt char genommen hab?
Vielleicht kommt es ja auf den virtuellen Speicher an:
Systemsteuerung->System->Erweitert->Bei Systemleistung auf Einstellungen(das erste)->Erweitert->Unten kann man es dann ändern
-
Natürlich macht es einen Unterschied wenn du int statt char nimmst. Überleg mal, ein char braucht 1 Byte Speicherplatz, ein int bei dir wahrscheinlich 4 Byte. Kann dein Ergebnis da also noch stimmen?
-
drakon schrieb:
zeusosc schrieb:
Bei mir kam eine Fehlermeldung als ich rund 1.4GB allociert hatte,.. also aufpasse

Wann macht man den auch sowas?!

Es soll Computer geben, bei denen diese Speichergröße noch nicht einmal 1% des physikalischen RAMs ist.
-
Speedy_92 schrieb:
zeusosc schrieb:
Bei mir kam eine Fehlermeldung als ich rund 1.4GB allociert hatte,.. also aufpasse

Würde gerne Wissen, wie man das mit 1.4 GB hinbekommen kann und herausfinden kann, wie kann ich so einen "genauen" Messwert herausbekommen ?
Task Manager *g*, das problem kam aber durch rekursive aufrufe, wobei die variablen über new allociert wurden, delete[] sollte diese eigentlich wieder frei geben, tat es aber net, naja mit malloc und free war das problem gelöst,..
grüüße
-
Speedy_92 schrieb:
const int DIM = 1000; int arr[DIM];Gibt es eine Grenze für DIM?
Ja, jedes Array ist erstmal durch SIZE_MAX limitiert. Diesen maximalen Wert kann man nicht immer ausschöpfen, da dies von einigen anderen Faktoren abhängt. Stackgröße, wieviel RAM ist noch in einem Block frei, wie groß dürfen Objekte mit static storage sein etc.