Programmgesteuert findet man die maximale statische Array-Größe in C ++

8

Ich bin neugierig, ob es möglich ist, die maximale Größe zu bestimmen, die ein Array in C ++ haben kann.

%Vor%

Dies kompiliert gut, aber dann segfolds, sobald ich es ausführen (obwohl Array nicht tatsächlich referenziert ist). Ich weiß, es ist auch die Array-Größe, denn wenn ich es auf 1000000 ändere, läuft es gut.

Also, gibt es einige Definitionen irgendwo oder eine Möglichkeit, #define MAX MAX_ALLOWED_ARRAY_SIZE_FOR_MY_MACHINE_DEFINED_SOMEWHERE_FOR_ME zu haben?

Ich brauche das eigentlich für nichts, diese Frage ist aus Neugier.

    
SirGuy 31.03.2012, 05:25
quelle

4 Antworten

10

Es gibt keine Möglichkeit, dies statisch zu bestimmen, da das tatsächliche Limit davon abhängt, wie viel Stack-Speicherplatz Ihr Thread erhalten hat. Sie könnten einen neuen Thread erstellen, ihm einen 10-Megabyte-Stack geben, und Sie könnten ein entsprechend größeres lokales Array zuweisen.

Der Betrag, den Sie auf dem Stapel zuweisen können, hängt auch davon ab, wie viel bisher bereits verwendet wurde.

    
Greg Hewgill 31.03.2012, 05:28
quelle
4
%Vor%

Dann können Sie vielleicht die letzte gedruckte Ebene mit 400 Bytes multiplizieren. Rekursive Aufrufe belegen den größten Teil des Stack-Platzes, aber Sie können eine Untergrenze erreichen. Ich vermisse hier vielleicht etwas Verständnis für Speicherverwaltung, also offen für Korrekturen.

Das ist also, was ich auf meiner Maschine mit variierender Dummy-Array-Größe bekommen habe.

%Vor%     
tartar 31.03.2012 05:27
quelle
2

Die meisten Variablen, die in Funktionen deklariert sind, werden auf dem Stack zugewiesen, was im Grunde ein Block von Gedächtnis von fester Größe. Der Versuch, eine Stapelvariable zuzuweisen, die größer als die Größe des Stapels ist, führt zu einem Stapelüberlauf , wodurch der Segfault verursacht wird durch.

Oft ist die Größe des Stacks 8MB, also hat long max[1000000] auf einem 64-Bit-Rechner die Größe 8*1000000 < 8MB (der Stack ist "sicher"), aber long max[2000000] hat die Größe 8*2000000 > 8MB , also der Stapelüberläufe und die Programmunterbrechungen.

Wenn Sie andererseits das Array dynamisch mit malloc belegen, wird der Speicher in den Heap verschoben ist im Prinzip unbegrenzt (4 GB auf einer 32-Bit-Maschine, 17 179 869 184 GB auf einer 64-Bit-Maschine).

    
huon 31.03.2012 05:39
quelle
1

Bitte lesen dies , um die Einschränkungen zu verstehen das wird von Hardware und Compiler festgelegt. Ich denke nicht, dass Sie einen MAX-Wert festlegen können, damit Sie ihn sofort verwenden können.

    
Tejas Patil 31.03.2012 05:36
quelle

Tags und Links