Das Definieren eines Destruktors verhindert, dass Memberfunktionen inline sind

8

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.

    
Gareth 14.11.2012, 02:26
quelle

2 Antworten

2

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.

    
Fabien 18.11.2012, 23:58
quelle
0
___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ qstntxt ___

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.

    
___ tag123inline ___ Eine Inline-Funktion ist eine Funktion, mit der der Compiler zur Inline-Erweiterung aufgefordert wurde. Mit anderen Worten hat der Programmierer angefordert, dass der Compiler den vollständigen Text der Funktion an jeder Stelle einfügt, an der die Funktion aufgerufen wird, anstatt Code zu generieren, um die Funktion an der Stelle aufzurufen, an der sie definiert ist. (Compiler sind jedoch nicht verpflichtet, diese Anfrage zu respektieren.) ___ answer13445935 ___

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.

    
___ antwort13372560 ___

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:

%Vor%     
___ qstnhdr ___ Das Definieren eines Destruktors verhindert, dass Memberfunktionen inline sind ___
Michael Shmalko 14.11.2012 03:25
quelle

Tags und Links