Dynamische Array im Stack mit Visual Studio Compiler



  • Moin Leute,
    es tut mir leid, aber ich hoffe ich habe den richtigen Teil des Forums für meine Frage getroffen.

    Es geht darum, dass ich ein C++-Visual-Studio-Projekt erweitern muss und nun folgendes Problem habe.

    Unter Linux kann ich wenn ich das richtig verstanden habe mit zum Beispiel:

    int array[size];
    

    einfach ein Array in den Stack packen, wobei size keine Konstante sein muss, sondern dynamisch beim Programmlauf gefüllt werden kann. Also kein rechenaufwändiges delete oder free.

    Der Windows Compiler akzeptiert jedoch lediglich Konstanten.

    Da ich die Funktion einige 100 mal die Sekunde aufrufen muss, ist es keine Option das Array in den Heap zu packen und dynamisch muss es eben auch sein.

    Ich habe noch gelesen, dass man mit Folgendem das evlt. auf Assembler-Ebene regeln kann, aber das bekomme ich auch nicht hin. Ich muss aber leider auch sagen, dass ich nicht soviel Ahnung habe.

    double array[1];
      _asm{
           add esp, groesse
     }
    

    Für jede Idee bin ich wirklich dankbar!

    Beste Grüße
    Manuel



  • ich persoenlich finde diese Art immer noch "unschoen", zumal es in c++ auch nicht dem Standard entspricht. std::vector faend ich da allemal besser, wenn man schon nicht selber mit new und delete herumwedeln will.

    Kenne zwar jetzt nicht die ganze Funktion und was sie alles tun soll, aber vielleicht laesst sich alternativ dazu eine bessere Loesung finden.

    Ansonsten duefte der GCC im Gegensatz zu den Microsoft-Compilern dieses so aktzeptieren.



  • Der Windows Compiler akzeptiert jedoch lediglich Konstanten.

    Ja ist in C++ so. Im C-Standard ist das erlaubt.

    Also kein rechenaufwändiges delete oder free.

    Ich glaube du missverstehst da was.

    ist es keine Option das Array in den Heap zu packen und dynamisch muss es eben auch sein. ... Ich muss aber leider auch sagen, dass ich nicht soviel Ahnung habe.

    Wenn du beschreibst, was du mit dem Array vorhast, dann kann dir vielleicht jemand mit Ahnung andere Optionen vorschlagen. Das Anlegen eines Arrays auf dem Stack variabler Laenge ist potentielle gefaehrlich. Ist das Array groesser als der Stack, dann fuehrt das im guestigen Fall zum Programmabsturz.



  • Auch wenn knivil es eigentlich schon gesagt hat, noch mal ganz klar: das hat nix mit Windows/Linux zu tun, sondern mit C/C++. In C(99) ist es erlaubt, in C++ nicht. Du könntest also vielleicht einen C99-Compiler verwenden. Die Frage ist halt, ob du dir mit dieser Methode nicht ganz andere Probleme ins Haus holst (z.B. stack overflow, wurde ja schon erwähnt).





  • Erstmal herzlichen Dank für die vielen Rückmeldungen.

    Ok, einen anderen Compiler zubenutzen ist da leider keine Option, da dies in ein bestehendes Projekt eingegliedert werden soll und die werden denke ich nicht wegen mir ihr Projekt umstellen :); außerdem war ich mir der Problematik mit dem stack overflow nicht bewusst, wo ihr natürlich trotzdem recht habt.

    knivil schrieb:

    Wenn du beschreibst, was du mit dem Array vorhast, dann kann dir vielleicht jemand mit Ahnung andere Optionen vorschlagen.

    Ok, also ich habe ein Plugin für einen Audioplayer geschrieben, das lediglich im grundegenommen einen Equalizer und Kompressor darstellt. Läuft auch soweit technisch ohne Probleme, nur verursacht es leider viel zu viel Processorlast. Naja da ich gelesen hatte, dass das Speicherfreigeben viel Zeit braucht, dachte ich könnte ich versuchen das etwas zu umgehen. Das Array brauche ich halt in der Berechnung für den Kompressor in jeden Block den ich bekomme und das ist bei einer Blockgröße der Sounddaten von wegen meiner 200 und einer Samplerate von 44100 einfach enorm häufig in der Sekunde.

    Naja der richtige Weg scheint mir dann wohl, dass ich irgendwie weiter versuche die Arrays komplett wegzuoptimieren und nicht wie ich anfangs dachte, dass es eine Lösung wäre die in den Stack zu verlagern.

    Herzlichen Dank für eure Hilfe!

    Beste Grüße
    Manuel



  • Du kannst den std::vector auch ausserhalb deiner Funktion definieren. Dann sparst du dir new/delete in der Funktion und musst dich nur um das Fuellen mit Daten kuemmern. Oder gibst der Verarbeitungsfunktion einen entsprechenden Zeiger + Laenge mit, den sie als Array benutzen kann, oder ...



  • _matze schrieb:

    C/C++

    Warum hat mich dafür eigentlich noch niemand geschlagen (auch wenn es in dem Kontext anders gemeint war)? 😃


Log in to reply