Forum: Compiler & IDEs Speicherlimit eines Programms


von Solocan Z. (solocan)


Lesenswert?

Ich portiere gerade ein Programm von C zu C++ und entdecke ein seltsames 
verhalten.
1
class wave{
2
  public:
3
    wave(){
4
    }
5
        int datin[500000];  //Funktioniert
6
        // int datin[600000];  //Läuft nicht mal an.
7
8
};

Dabei gibt es beim Kompilieren gar keine Fehler oder Warnungen.

Hat jemand eine Idee, woran es liegen könnte? Gibt in Eclipse irgendwo 
einen Speicherlimit oder ähnliches?

: Bearbeitet durch User
von Michael D. (nospam2000)


Lesenswert?

Wie viele immer wieder schreiben: den entscheidenden Teil deines 
Programms hast du weggelassen. Daher muss ich viel Hellsehen und liege 
ggf. falsch.

Falls du z.B. in der main() Funktion so eine Instanz erzeugst:
1
int main() {
2
  wave myWave;
3
}

dann produzierst du wahrscheinlich einen Stack overflow, falls die 
Stack-size nur 512 kB ist.

Wenn du den Speicher mit 'new' auf dem Heap allokierst, dann vermeidest 
du den Stack overflow:
1
int main() {
2
  wave* pMyWave = new wave();
3
  [...]
4
  delete pMyWave;
5
}

Solch große Datenblöcke sollte man nicht auf den Stack legen.

: Bearbeitet durch User
von Nicht W. (nichtsowichtig)


Lesenswert?

Solocan Z. schrieb:
> Ich portiere gerade ein Programm von C zu C++ und entdecke ein seltsames
> verhalten.
>
>
1
> class wave{
2
>   public:
3
>     wave(){
4
>     }
5
>         int datin[500000];  //Funktioniert
6
>         // int datin[600000];  //Läuft nicht mal an.
7
> 
8
> };
9
>
>
> Dabei gibt es beim Kompilieren gar keine Fehler oder Warnungen.
>
> Hat jemand eine Idee, woran es liegen könnte? Gibt in Eclipse irgendwo
> einen Speicherlimit oder ähnliches?

Vielleicht // bei
// int datin[600000];
entfernen, dann läuft es.

von UTF-8 (Gast)


Lesenswert?

Nicht W. schrieb:
> Vielleicht // bei
> // int datin[600000];
> entfernen, dann läuft es.

voll witzig. Höhö

von M.K. B. (mkbit)


Lesenswert?

Könnte es sein, dass sich mit dem Umstieg C nach C++ auch die Größe 
deines int geändert hat?

Ansonsten wäre der Kontext und die Compileroptionen hilfreich.

von Helmut S. (helmuts)


Lesenswert?

Zumindest bei einem Programm mit einem großen globalen Array musste ich 
dem Linker genügend Platz auf dem Stack geben.

/stack:0x1000000

: Bearbeitet durch User
von PittyJ (Gast)


Lesenswert?

Bei mir geht das.

von Dr. Sommer (Gast)


Lesenswert?

Solocan Z. schrieb:
> Dabei gibt es beim Kompilieren gar keine Fehler oder Warnungen.

Du legst ja auch nie eine Instanz von "wave" an. Du kannst beliebig 
viele beliebig große Klassen definieren, ohne dass was passiert. Erst 
wenn du davon Instanzen anlegen möchtest, gibt es Probleme. Ganz genau 
wie bei "struct" in C.

Ein struct oder eine Klasse ist wie ein Bauplan. Du kannst auch einen 
Bauplan von einem Flughafen aufmalen ohne dass es Probleme gibt. Erst 
wenn man ihn bauen will fällt auf dass es auf der Welt nicht genug Kabel 
gibt, oder was auch immer das Problem ist...

von Rolf M. (rmagnus)


Lesenswert?

Helmut S. schrieb:
> Zumindest bei einem Programm mit einem großen globalen Array musste ich
> dem Linker genügend Platz auf dem Stack geben.

Wenn das Array global ist, braucht man dafür keinen Platz auf dem Stack.
Nur wenn es lokal und nicht static ist.

von Peter D. (peda)


Lesenswert?

Michael D. schrieb:
> Wie viele immer wieder schreiben: den entscheidenden Teil deines
> Programms hast du weggelassen.

Überhaupt fehlt erstmal das Wichtigste, welches Target, welcher 
Compiler, welches OS usw.?
Da Du ja nicht unter PC-Programmierung postest, kann es alles mögliche 
sein, außer ein W10- oder Linux-PC.


Solocan Z. schrieb:
> Gibt in Eclipse irgendwo
> einen Speicherlimit oder ähnliches?

Nö, eine IDE kennt keine Limits. Die kennt erst das Linker-Script für 
Dein unbekanntes Target.
Z.B. auf einem ARM Cortex bräuchtest Du dafür schonmal 2,4MB RAM je 
Instanz.

von Solocan Z. (solocan)


Lesenswert?

Danke für sehr hilfreiche Antworten.

Ja, es lag daran, dass das Array durchs Instanzieren in den 
Programmspeicher gelegt wurde und dieser nicht ausreichte. Dynamisches 
Allokieren hat das Problem beseitigt.

Ich werde mir jetzt in Ruhe mal das Speicherkonzept und Anwendung von 
C++ angucken.

von Vincent H. (vinci)


Lesenswert?

Bitte statt new unique_ptr benutzen:
https://en.cppreference.com/w/cpp/memory/unique_ptr

Ein rohes new sollte in modernem C++ nicht mehr zu finden sein.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.