2016-10-21 3 views
0

First off, ist dies kein Betrogene dieser Frage:Anonyme Methoden inline ausführen?

Are anonymous methods defined inline?

Ich denke, dass Fragesteller hat eine andere Frage stellt.

Ich erkundige mich nach Methode Inlining, wo während des Kompiliervorgangs der Aufruf einer Methode durch die tatsächliche der Methode ersetzt wird.

Mein Verständnis von anonymen Methoden ist, dass sie tatsächlich zu konkreten Methoden mit einem Compiler-zugewiesenen Namen kompilieren. Dies wird getan, um den Stack-Overhead zu reduzieren. Wenn anonyme Methoden kompiliert werden, sind sie genauso inline?

+0

Eine beliebige Anzahl von kostenlosen .NET Decompilern kann Ihnen die Antwort darauf zeigen. –

Antwort

0

Anonyme Methoden funktionieren genauso wie normale Methoden - wenn der JIT-Compiler sie inline einfügt, können sie inline werden.

Am wahrscheinlichsten rufen Sie jedoch keine anonyme Methode direkt auf - Sie rufen einen Delegaten auf, der auf die anonyme Methode verweist. In diesem Fall kann der Compiler, wie bei jedem anderen Aufruf von Delegaten, nichts inline einfügen, da er zur Kompilierungszeit (oder JIT-Zeit) nicht weiß, welche Methode tatsächlich aufgerufen wird.

Ich denke, Sie sind verwirrt mit wie Generika in .NET arbeiten, anstatt anonymen Methoden explizit, insbesondere mit C++ 's-Vorlagen kontrastierten - zum Beispiel, wenn ich collection.Select(i => i.SomeProperty) in C# zu tun, gibt es nach wie vor nur eine Methode Select [1]; Wie würden Sie die i => i.SomeProperty Methode inline, wenn es andere Select Aufrufe gibt, die verschiedene Funktionen als Argumente annehmen? Im Gegensatz dazu erlaubt das Verwenden von Vorlagen in C++ das Einfügen von "Funktions" -Argumenten, da die Vorlagen nur eine Kompilierzeit-Codegenerierungsfunktion sind; Jede Verwendung eines analogen Select-Templates in C++ würde Ihnen einen separaten Codeabschnitt geben, an dem kein Methodenaufruf beteiligt ist.

Es ist unnötig zu sagen, dass dies nur ein Implementierungsdetail ist. Für einen zukünftigen Compiler wäre es sinnvoll, den Methodenaufruf zu verknüpfen, indem er vorgibt, kein Delegat zu sein, und die Methode Select selbst inline einfügt.

[1] - Technisch gesehen gibt es während der JIT-Kompilierung möglicherweise mehrere Versionen der Select-Methode für verschiedene Typargumente - dies hat jedoch keine Auswirkungen auf dieses Szenario; es macht immer noch keine andere Methode für jedes mögliche Argument.

+0

Während der JIT-Kompilierung gibt es * mehrere Versionen der 'Select'-Methode, daher kann ich (im allgemeinen Fall) nicht nachvollziehen, warum der JIT-Compiler eine (konkrete) generische Methode inline einbinden könnte. LINQ ist jedoch ein ziemlich spezieller Fall, da es viele Installationen gibt, die mit 'IEnumerable ' passieren, und außerdem wird es faul ausgewertet, also bezweifle ich, dass irgendeine der Erweiterungsmethoden wie 'Select' in der Praxis inline wird. Die einzige Situation, die mir einfällt, wäre eine sofortige 'ToList', d. H.' Items.Select (i => i.x) .ToList() 'vollständig in eine Schleife eingebunden. – Groo

+0

(sowieso, mein Punkt ist nur das 'Select' und andere LINQ-Methoden sind besonders schwer zu inline) – Groo

+0

@Groo Einverstanden, inline die tatsächlichen LINQ-Erweiterung Methoden wäre schwierig, wenn nicht unmöglich. Meine Frage bezieht sich jedoch auf die Inlinierung des anonymen Delegierten selbst. Wenn es nicht inlined ist, würde das Aufrufen von .Select() zwei Aufrufe auf dem Stapel hinzufügen, während es nur einen geben würde, wenn der anonyme Delegiertenkörper inline wäre. – oscilatingcretin

Verwandte Themen