Warum integrieren Compiler keine Konstantenerfassungen in mein Lambda?C++

Programme in C++. Entwicklerforum
Guest
 Warum integrieren Compiler keine Konstantenerfassungen in mein Lambda?

Post by Guest »

Angesichts der Definition:

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); }
Ich würde erwarten, dass oneCall von optimierenden Compilern eine Funktion mit abgerollter/eliminierter Schleife zurückgibt.
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.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post