Code: Select all
#include
void call();
static constexpr inline auto nWrap(std::size_t n) {
return [n]() constexpr { for (std::size_t i = 0; i != n; ++i) call(); };
}
std::function oneCall() { return nWrap(1); }
std::function nCalls(std::size_t n) { return nWrap(n); }
Dennoch erstellen gcc, clang, msvc und icc alle Funktionsdefinitionen mit Schleifen.
Tatsächlich scheinen keine Ausdrücke, die erfasste Konstanten beinhalten (z. B. die Summe zweier Konstanten), inline zu sein. Gibt es etwas in der Definition, das Inlining verhindert? (Da alle Compiler einer Meinung zu sein scheinen.)
Wie kann ich nWrap definieren, damit der Aufrufer erfasste Konstanten einbinden kann? (d. h. die Schleife abwickeln, wenn sie mit einer Kompilierzeitkonstante n aufgerufen wird)
Durch manuelles Verschieben der Lambda-Definition in oneCall wird die Schleife im generierten Code eliminiert !
Templating nWrap funktioniert nicht, außer wenn ich einen Template-Parameter für n verwende. Das Hinzufügen oder Entfernen verschiedener statischers, inlines und constexprs hat kaum Auswirkungen.
Der Produktionscode umschließt tatsächlich ein vom Aufrufer bereitgestelltes Lambda ( oder aufrufbar) in einer std::function.
Das Aufrufer-Lambda ist inline. Dennoch kann ich keine Möglichkeit finden, die Schleife für den allgemeinen Einzelaufruf-Anwendungsfall zu beseitigen, ohne zwei separate Lambda-Funktionen zu definieren.