std::visit overloaded mit Captures



  • Wenn man so einen overloaded Helper verwendet, wie z.B. hier:

    https://en.cppreference.com/w/cpp/utility/variant/visit

    // helper type for the visitor #4
    template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
    template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;
    

    und die Lamdas, die man übergibt, Captures haben, dann erzeugt zumindest VS ziemlich viel Code, um die Captures zu initialisieren. Sagen wir, ich hab ein std::variant mit 5 Typen, also 5 Lamdbas, und die capturen jeweils zwei Variablen, dann kommt erstmal einiges an Assemblercode zusammen, um die Lambdas zu konstruieren, wobei dann im Endeffekt nur eins davon benötigt wird.
    Gibt es hier vielleicht irgendwelche Ansätze, um das optimaler umzusetzen?

    Bzw., ich denke, das Problem fängt schon damit an, dass std::visit eine Jump Table aufbaut, und den Code nicht inlinen kann. Sonst würde der Compiler vielleicht gar nicht erst die Lambas aufbauen, sondern sehen, dass sie nur auf lokale Variablen zugreifen und er dann im Endeffekt "nichts" machen muss.

    Hat das schon mal jemand irgendwie "besser" gelöst?


Log in to reply