Tail call optimization in C, C++?



  • Hat irgendjemand einen Überblick wie's da derzeit bei gängigen Compilern aussieht, speziell bzgl tail recursion?



  • VS03.net und VS05 machen beides recht zuverlaessig.



  • rapso schrieb:

    VS03.net und VS05 machen beides recht zuverlaessig.

    Cool. Ich konnt's mir gerade nicht lassen, das mal zu testen. Es wird standardmäßig optimiert (VS2005). Is' ja fast wie in Scheme hier. 🤡



  • Gehts da um das alte "jmp statt call+ret"?



  • hustbaer schrieb:

    Gehts da um das alte "jmp statt call+ret"?

    Ja.



  • rapso schrieb:

    VS03.net und VS05 machen beides recht zuverlaessig.

    Ah, danke. Aber was "recht zuverlässig" bedeutet ist auch nicht bekannt?

    Google hatte nur einige Links hervorgebracht à la "schwer zu machen in C(++)", mit tausenden von Fällen wo's nicht wirklich geht, aber auch nichts konkretes...



  • finix schrieb:

    Google hatte nur einige Links hervorgebracht à la "schwer zu machen in C(++)", mit tausenden von Fällen wo's nicht wirklich geht, aber auch nichts konkretes...

    Hm, welche Fälle sollen das denn sein? Im Prinzip ist diese Transformation doch trivial, wenn man einen Syntaxbaum vorliegen hat; oder irre ich mich da?



  • Hab leider keine Links mehr dazu. Die Probleme betreffen wohl hauptsächlich den allgemeinen Tail Call, z.B. wegen Stackvariablen.



  • finix schrieb:

    rapso schrieb:

    VS03.net und VS05 machen beides recht zuverlaessig.

    Ah, danke. Aber was "recht zuverlässig" bedeutet ist auch nicht bekannt?

    natuerlich ist mir bekannt was meine aussagen bedeuten 😕
    wenn der coder keinen bockmisst macht ist das optimiert. bockmisst ist z.b. locale parameter per reference zu uebergeben.
    uebergibt man parameter die die funktion erhalten hat, laeuft es problemlos (reihenfolge muss auch stimmen).



  • rapso schrieb:

    uebergibt man parameter die die funktion erhalten hat, laeuft es problemlos (reihenfolge muss auch stimmen).

    Wieso muss die Reihenfolge stimmen? Wenn sie nicht stimmt, reicht es doch, vor dem jmp ein Swap auszuführen.



  • rapso schrieb:

    bockmisst ist z.b. locale parameter per reference zu uebergeben.
    uebergibt man parameter die die funktion erhalten hat, laeuft es problemlos (reihenfolge muss auch stimmen).

    Genau sowas meinte ich eigentlich 😉



  • Konrad Rudolph schrieb:

    rapso schrieb:

    uebergibt man parameter die die funktion erhalten hat, laeuft es problemlos (reihenfolge muss auch stimmen).

    Wieso muss die Reihenfolge stimmen? Wenn sie nicht stimmt, reicht es doch, vor dem jmp ein Swap auszuführen.

    jmp mit swappen:

    int tmp=param1;param1=param2;param2=tmp;jmp
    

    call

    newparam1=param2;newparam1=param1;call [+return]
    

    ich glaube diese kostenrechnung gewinnt dann call+return gegenueber jmp.



  • rapso schrieb:

    ich glaube diese kostenrechnung gewinnt dann call+return gegenueber jmp.

    Eventuell, was die Geschwindigkeit angeht. Auf keinen Fall, was den Speicherverbrauch (bei der Ausführung) angeht. Klar, sowas ist höchstens in funktionalen Sprachen relevant ...



  • Konrad Rudolph schrieb:

    rapso schrieb:

    ich glaube diese kostenrechnung gewinnt dann call+return gegenueber jmp.

    Eventuell, was die Geschwindigkeit angeht. Auf keinen Fall, was den Speicherverbrauch (bei der Ausführung) angeht. Klar, sowas ist höchstens in funktionalen Sprachen relevant ...

    jo, das ist wohl einfach nur eine performance optimierung. speicheroptimierungen koennen wegen cache auch performance bringen, aber ich glaube sowas waere schlecht vom compiler einzuschaetzen. es kann auch sein dass es faelle gibt in denen geswaped wird. ich weiss nur dass ich mir angewohnt habe eine struct mit allen daten von function zu function weiterzuleiten, das ermoeglicht dem compiler auf einfache weise jegliche optimierungen vorzunehmen.


Log in to reply