2016-05-08 8 views
2

Angenommen, ich habe eine Klasse wie folgt aus:Virtuelle Methoden Optimierung

class MyClass{ 
    int somedata; 
    public: 
    virtual void DoSomething() { /*do something here*/} 
}; 

Und dann habe ich nie von dieser Klasse ableiten je. Ich merke, dass, wenn der Compiler gerade die Assembly genau so schreibt, wie der Code geschrieben wird, jede einzelne MyClass Instanz eine zusätzliche Datengröße wegen der virtuellen Funktion hat.

So ist es standardkonform für den Optimierer Optimieren Sie die Klasse etwas wie folgt:

class MyClass{ 
    int somedata; 
    public: 
    void DoSomething() { /*do something here*/} //Note absence of virtual 
}; 

Wenn es eine standardkonforme Optimierung ist, macht das überhaupt ein Compiler?

+0

Können Sie ein konformes Programm schreiben, das den Unterschied erkennen kann? –

+0

@PeteBecker Vielleicht, wenn ich ein Array von 'MyClass's hatte und dann einen' void' Zeiger für den Zugriff auf Mitglieder verwendete ... aber das ist ziemlich extrem ... – DarthRubik

+0

Sie können nicht auf Mitglieder durch einen 'void' Zeiger in zugreifen ein konformes Programm. –

Antwort

4

Es entspricht den Standards für Compiler und Linker, alles zu tun, was das Herz begehrt, solange es sich nicht auf das erwartete Verhalten des Codes auswirkt, wie das von Ihnen genannte Beispiel.

Ich erinnere mich deutlich durch Durchsuchen der letzten gcc Release Notes eine spezielle Erwähnung, dass in Zusammenarbeit mit dem Linker, tut es genau dies.

-1

Sie sollten das endgültige Schlüsselwort verwenden, das in C++ 11 Standard eingeführt wurde.

Class My class { 

Public: 
Void doSomething() final; 
} 
+0

Ich bin nicht 100% überzeugt, dass dies die Frage beantwortet, aber ich vermute, dass es mit ein bisschen mehr Erklärung könnte. – DavidW

Verwandte Themen