Wie grefit C++ auf Daten zu die auf dem Stack liegen?



  • Hi,

    ich weiß nicht genau ob dieser Post nicht eher in ein anderes Forum gehört, aber falls ja, bitte einfach verschieben.

    Also, soweit ich weiß gilt folgendes.
    - Alle Speicherbereiche die man per new anfordert werden auf dem Heap angelegt
    - Alle lokalen Variablen und Funktionsargumente werden auf den Stack gepackt

    Meine Frage ist nun, wie kann C++ z.B auf. das 20ste Funktionsargument zugreifen.
    Es gibt ja nicht soviele Register. Oder trübt mich da mein Wissen über den Stack.
    Meiner Meinung nach müsste es ja noch irgendwie alle 19 vorherigen Argumente auslagern bevor es auf das 20ste zugreifen kann.
    Wenn es diese 19 anderen auf den Heap auslagern würde, könnte man sie ja direkt dorthin packen.

    Ich hoffe es wird ungefähr klar was ich will.

    Schonmal vielen Dank



  • evtl nimmt er die "Objekte" solange aus dem Stack und packt sie wieder oben drauf, bis er das richtige findet



  • Aber wo packt er sie in der Zwischenzeit hin?
    Es gibt ja nicht genügend Register um beispielsweise 19 Argumente wegzupacken?



  • Dein Stack "Wissen" trügt.
    Register haben nix mit dem Stack zu tun. Wenn du eine Funktion mit 20 Parametern aufrufst, werden 20 Parameter auf den Stack gepusht und ein Framepointer eingerichtet (ich beziehe mich hier auf eine abstrakte Maschine, um das Prinzip zu verdeutlichen). Wenn da nun etwas steht wie a=b+1;, wobei a und b Parameter sind, dann wird zunächst der Inhalt von b in ein Register geladen (und das geschieht per Adressierung mittels Framepointer), dann die Konstante 1 in ein Register, add ausgeführt und abschließend die Summe vom Zielregister auf den Stack gepusht, der Wert an die Speicherstelle von a geschrieben und der Wert letztendlich vom Stack wieder gepopt.

    Der Stack ist im RAM, die Register auf der CPU.



  • Der Stack und die CPU-Register sind doch zwei verschiedene Dinge. Was hat das eine mit dem anderen zu tun?

    Die CPU-Register werden natürlich nur dann genutzt, wenn es "passt".



  • zwutz schrieb:

    evtl nimmt er die "Objekte" solange aus dem Stack und packt sie wieder oben drauf, bis er das richtige findet

    Wie bitte?

    Edit: 1337 Postings;)



  • this->that schrieb:

    Wie bitte?

    oops.. ich merk grad, dass ich da was verwechselt hab...



  • Konnte man bei einem Stack nicht immer nur auf das oberste Element zugreifen?
    ( LIFO-Prinzip )
    Ansonsten wäre es ja eher eine Art Array mit Stack Funktionen.



  • Achtung Halbwissen:

    Wenn ich mich noch richtig an meine Assembler-Exkursion erinnere, können Werte auf "dem Stack" bei der Parameterübergabe mittels Stackpointer und Basepointer (und ein paar Additionen) adressiert werden.

    Pseudo-Assembler:

    move register sp to register bp
    // Momentaufnahme des Stackpointers wird gesichert, da man ja innerhalb der
    //  Funktion auch mal Daten auf den Stack schaufelt.
    
    // Davon ausgehend, dass an sp (StackPointer) die Rücksprungadresse und diese
    //  eine Breite von 4 Bytes besitzt, ist sp + 4 die Adresse des ersten Parameters
    move *(bp + 4) to register eax
    
    // So kann man dann auch mit den anderen Parametern verfahren
    move *(bp + 16) to register ebx
    
    // etc.
    

    Das ist so Möglich, weil die Breiten (in Bytes) der einzelnen Argumente ja durch die starke Typbindung immer bekannt sind.

    Besser Aufgehoben ist das Ganze allerdings wohl in der Assembler-Sektion.

    Grüße... Heiko



  • Wie ihr es jetzt erklärt habt, ist es schlüssig, aber meine Frage ziehlte auf etwas anderes ab.
    Wenn ich einen Zeiger auf einen bestimmten Teil eines Stacks habe, wäre das nicht in gewisser Weise ein Hack?
    Momentan ist folgendes für mich ein Stack. http://de.wikipedia.org/wiki/Stapelspeicher
    Wenn ich nun doch per Zeiger auf andere Elemente zugreife ist es doch nicht mehr ein Stack, oder?



  • Häng Dich nicht am Begriff "Stapel" auf. Der Begriff wird sich sicher durch ein Gedankenexperiment gebildet haben und Menschen neigen nunmal dazu, alles in Schubladen stecken zu wollen (Abstraktion) 😉

    Genauso gut, kann man sich die Funktionsweise des "Stacks" erklären, wie wenn man sich den Hauptspeicher als eine Reihe einachsiger Dreiseitenkipper (Schubkarren) vorstellt bei welchen ein Bauarbeiter als "Stackpointer" agiert, der jedes mal "hier" ruft und einen Karre vor oder zurück geht, wenn ich eine Schippe Speiß in die "Stack"-Karre schmeißen oder wieder herausholen will.

    Das hindert mich aber nicht daran, diesen einfach zu übergehen und die Karren vollzuladen oder leerzuräumen, die mir gerade am besten gefallen.

    Ein "Hack" entsteht nur in Deiner Vorstellung, weil du den Begriff "Stapel" gedanklich zuweit einschränkst.

    Grüße... Heiko



  • bwbg schrieb:

    [...] als eine Reihe einachsiger Dreiseitenkipper (Schubkarren) [...]

    Danke für die Synchronübersetzung - ich hätt's sonst wirklich nicht geschnallt, mit der Scheibtruhe 😃

    cheers, Swordfish


Anmelden zum Antworten