2016-04-04 3 views
3

erhalten Gibt es eine Möglichkeit zu wissen, wie viele Anweisungen oder Ressourcen von einer Variablen oder einem Objekt in der kompilierten ausführbaren Datei verwendet werden?

Zum Beispiel würde ich gerne wissen, wie viel Platz ein leeres std::vector<int> in der kompilierten Binärdatei verwenden wird.C++ die Größe eines Teils des verwendeten Codes in den kompilierten Code

+1

Ja. Eine Variable verwendet keine Anweisungen. –

+0

Aber der Aufruf an den Konstruktor verwendet Anweisungen. –

+4

Das zu fragen macht nicht viel Sinn. Was zielst du eigentlich? – wilx

Antwort

0

Weisen Sie den Compiler an, einen Assembly-Eintrag zu generieren (Compiler/Linker-Optionen, hängt von Ihrem Compiler und Ihrer Plattform ab). Kompiliere es dann einmal mit und einmal ohne die Variable oder das Objekt. Vergleichen Sie die Anzahl der Zeilen in den zwei generierten Auflistungen. Dies sollte Ihnen die Differenz der Befehlsanzahl geben.

EDIT: Die Messung ist möglicherweise nicht 100% genau aufgrund verschiedener Optimierungen, Ausrichtung, Code-Neuordnung. Wie @Klaus herausstellte, können paradoxe Ergebnisse auftreten, wenn Schwellenwerte überschritten werden und kleinere Einträge von mehr Quellen erzeugt werden.

EDIT: speziell in Verbindung mit C++ Vorlagen finden Sie auch Can we see the template instantiated code by C++ compiler

(Sie erwähnt „innerhalb der kompilierte ausführbare Datei“, so nehme ich an, dass Sie zu kompilieren Zeit wurden gefragt, nicht Laufzeit).

+0

Dies ermöglicht den Compiler nicht einschließlich NOP- oder NOOP-Anweisungen. Diese werden von einigen Prozessoren unterstützt, um ein vorhersagbares Timing von Operationen mit Registern, Prozessorstatusflags oder sogar Speicherzugriff zu ermöglichen. Es erlaubt auch nicht verschiedene Wege, auf denen Compiler/Optimierer Code neu ordnen. – Peter

+0

Das ist eine ziemlich aufdringliche Lösung. Dadurch ändere ich effektiv meinen Quellcode. Gibt es keine Möglichkeit, den generierten Binärcode zu überprüfen? – lucab0ni

+0

@ lucab0ni: Ja. Lesen Sie seine Montage. Sie müssen die Assembly lesen können. –

-1

Autoren des Buches "C++ Templates The Complete Guide" (Kapitel 6.6.4) schlagen vor, so genannte Tracer-Objekte für ähnliche Zwecke zu verwenden.

Es ist Zitat:.

„Ein Tracer ist eine benutzerdefinierte Klasse, die als Argument für eine Vorlage verwendet werden kann, um zu prüfen Oft steht geschrieben, nur um erfüllen die Anforderungen der Vorlage und nicht mehr als diese Anforderungen.Wichtiger jedoch sollte ein Tracer eine Spur der Operationen erzeugen, die auf ihm aufgerufen werden. Dies ermöglicht zum Beispiel experimentell die Effizienz von Algorithmen sowie die Reihenfolge der Operationen zu verifizieren.

Einfaches Beispiel von Tracer-Objekt:

#include <iostream> 
#include <vector> 

class TracerObject 
{ 
public: 
    TracerObject() 
    { 
     ++n_created; 
    } 
    ~TracerObject() 
    { 
     ++n_destroyed; 
    } 
    static int created_count(void) 
    { 
     return n_created; 
    } 
    static int destroyed_count(void) 
    { 
     return n_destroyed; 
    } 
    private: 
    static int n_created; 
    static int n_destroyed; 
}; 

int TracerObject::n_created = 0; 
int TracerObject::n_destroyed = 0; 

int main(void) 
{ 
    { 
     std::vector<TracerObject> vector(2, TracerObject()); 
    } 
    std::cout << "Constructor calls: " << TracerObject::created_count() << std::endl; 
std::cout << "Destructor calls: " << TracerObject::destroyed_count() << std::endl; 
    int i; 
    std::cin >> i; 
    return 0; 
} 
+0

Dies ändert grundlegend das, was Sie beobachten möchten. –

+0

Ich dachte, dass das Verwenden dieses Objekts als Vektorunterklasseninstanz beispielsweise Informationen über den verwendeten Speicher enthalten kann – LmTinyToon

Verwandte Themen