In VS 2010 scheint der Compiler den endgültigen Wert in der Kompilierzeit zu berechnen und lädt ihn nur für den Wert von a
in den Stapel.
Wenn Sie den Code wie folgt ändern, wurde diese Optimierung mit dem definierten Destruktor aktiviert:
Ich sehe ein seltsames Problem, bei dem Membermethoden nicht inline werden, wenn ich einen Destruktor definiere.
Beispielcode:
%Vor%Wenn ich den Standard-Destruktor verwende, bekomme ich etwas wie folgt:
%Vor%Aber wenn ich meinen eigenen blanken Destruktor definiere, wie im obigen Code:
%Vor%Wurde als Release-Build mit Visual Studio 2012 (v110) kompiliert, obwohl auch Visual Studio 2010 (v100) getestet wurde. Ich habe versucht, / Ob2 zu helfen, es zu überzeugen, die Methode ohne Glück zu inline.
Ich bin mit der Assembly nicht vertraut genug, um genau zu wissen, was es zu tun versucht, vielleicht werde ich morgen versuchen, das herauszufinden, um es zu sehen, wenn es irgendwelche Hinweise gibt. Kann irgendjemand etwas darüber sagen, warum die Definition eines leeren Destruktors verhindern würde, dass die Methode inline ist?
BEARBEITEN [17/11/2012]Ich habe den obigen Code aktualisiert, um viel einfacher zu sein (ursprünglich arbeitete ich an meiner Vector-Klasse).
Das Zurückgeben eines primitiven Typs von einer Member-Methode scheint korrekt zu inline zu gehen, es ist nur ein Problem, wenn ich eine Instanz meiner Klasse zurückgebe.
Ich sehe ein seltsames Problem, bei dem Membermethoden nicht inline werden, wenn ich einen Destruktor definiere.
Beispielcode:
%Vor%Wenn ich den Standard-Destruktor verwende, bekomme ich etwas wie folgt:
%Vor%Aber wenn ich meinen eigenen blanken Destruktor definiere, wie im obigen Code:
%Vor%Wurde als Release-Build mit Visual Studio 2012 (v110) kompiliert, obwohl auch Visual Studio 2010 (v100) getestet wurde. Ich habe versucht, / Ob2 zu helfen, es zu überzeugen, die Methode ohne Glück zu inline.
Ich bin mit der Assembly nicht vertraut genug, um genau zu wissen, was es zu tun versucht, vielleicht werde ich morgen versuchen, das herauszufinden, um es zu sehen, wenn es irgendwelche Hinweise gibt. Kann irgendjemand etwas darüber sagen, warum die Definition eines leeren Destruktors verhindern würde, dass die Methode inline ist?
BEARBEITEN [17/11/2012]Ich habe den obigen Code aktualisiert, um viel einfacher zu sein (ursprünglich arbeitete ich an meiner Vector-Klasse).
Das Zurückgeben eines primitiven Typs von einer Member-Methode scheint korrekt zu inline zu gehen, es ist nur ein Problem, wenn ich eine Instanz meiner Klasse zurückgebe.
Visual Studio behandelt Klassen mit Destruktoren (leer oder nicht) als "komplex", und sie werden bestimmte Optimierungen eher aufgeben. Wenn Ihre Klasse einfach und geschwindigkeitsabhängig ist, verwenden Sie den Standarddestruktor.
In VS 2010 scheint der Compiler den endgültigen Wert in der Kompilierzeit zu berechnen und lädt ihn nur für den Wert von a
in den Stapel.
Wenn Sie den Code wie folgt ändern, wurde diese Optimierung mit dem definierten Destruktor aktiviert: