Überlegungen zur Leistung der Vererbung in C #

8

Produziert der Compiler dieselbe IL, wenn ich eine Klasse mit public int I; (oder einem anderen Feld) erzeuge, statt eine Klasse zu erstellen, die von einer Basisklasse mit public int I; ?

erbt?

In beiden Fällen verhält sich die resultierende Klasse identisch, aber verhält sich der Compiler identisch?

I.e., ist der Compiler nur Kopieren-Einfügen von Code aus Basisklassen in die abgeleiteten Klassen, oder erstellt es tatsächlich zwei verschiedene Klassenobjekte, wenn Sie erben?

%Vor%

Gibt es jetzt einen Leistungsunterschied zwischen den folgenden zwei DoSomething () -Aufrufen?

%Vor%

Versuchen Sie, alle Optimierungen zu ignorieren, die der Compiler für diesen speziellen Fall ausführen könnte. Meine Frage ist, ob Vererbung in C # im Allgemeinen eine damit verbundene Leistungseinbuße hat. Die meiste Zeit ist mir egal, aber manchmal möchte ich ein Stück Hochfrequenz-Code optimieren.

    
Olhovsky 06.05.2011, 05:51
quelle

1 Antwort

8

Was der Compiler aussendet, ist identisch; Selbst wenn eine nicht-virtuelle Instanzmethode für eine versiegelte Klasse aufgerufen wird, wird Callvirt verwendet. Dies ist die gleiche Methode wie beim Aufruf einer Methode mit Polymorphismus.

Und nein: Es ist kein Kopieren / Einfügen - der Code, den Sie in A geschrieben haben, bleibt als Teil von A erhalten. Und nein, du bekommst 2 Objekte nicht nur wegen der Vererbung. Es kombiniert das Verhalten ; Eine Instanz von B hat auch die Implementierung von A - aber nicht über Kopieren einfügen: a B ist auch ein A - dh ein Dog ist auch ein Mammal , etc.

    
Marc Gravell 06.05.2011, 06:02
quelle

Tags und Links