mikrocontroller.net

Forum: Compiler & IDEs Speicherlimit eines Programms


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Solocan Z. (solocan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich portiere gerade ein Programm von C zu C++ und entdecke ein seltsames 
verhalten.
class wave{
  public:
    wave(){
    }
        int datin[500000];  //Funktioniert
        // int datin[600000];  //Läuft nicht mal an.

};

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
Autor: Michael D. (nospam2000)
Datum:

Bewertung
1 lesenswert
nicht 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:
int main() {
  wave myWave;
}

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:
int main() {
  wave* pMyWave = new wave();
  [...]
  delete pMyWave;
}

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

: Bearbeitet durch User
Autor: Nicht W. (nichtsowichtig)
Datum:

Bewertung
-4 lesenswert
nicht lesenswert
Solocan Z. schrieb:
> Ich portiere gerade ein Programm von C zu C++ und entdecke ein seltsames
> verhalten.
>
>
> class wave{
>   public:
>     wave(){
>     }
>         int datin[500000];  //Funktioniert
>         // int datin[600000];  //Läuft nicht mal an.
> 
> };
> 
>
> 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.

Autor: UTF-8 (Gast)
Datum:

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

voll witzig. Höhö

Autor: M.K. B. (mkbit)
Datum:

Bewertung
1 lesenswert
nicht 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.

Autor: Helmut S. (helmuts)
Datum:

Bewertung
1 lesenswert
nicht 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
Autor: PittyJ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei mir geht das.

Autor: Dr. Sommer (Gast)
Datum:

Bewertung
1 lesenswert
nicht 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...

Autor: Rolf M. (rmagnus)
Datum:

Bewertung
1 lesenswert
nicht 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.

Autor: Peter D. (peda)
Datum:

Bewertung
2 lesenswert
nicht 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.

Autor: Solocan Z. (solocan)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Vincent H. (vinci)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.