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
Antwort
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).
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
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
@ lucab0ni: Ja. Lesen Sie seine Montage. Sie müssen die Assembly lesen können. –
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;
}
Dies ändert grundlegend das, was Sie beobachten möchten. –
Ich dachte, dass das Verwenden dieses Objekts als Vektorunterklasseninstanz beispielsweise Informationen über den verwendeten Speicher enthalten kann – LmTinyToon
- 1. Wiederholen eines Teils des Codes in Python 3.4.4
- 2. Verwenden einer großen TObjectList und Freigeben des nicht verwendeten Teils
- 3. Dehnen eines Teils des Hintergrundbildes
- 4. Wie Ausführen eines Teils des Codes nur einmal beim Ausführen mehrerer Instanzen in T-SQL
- 5. Kopieren eines Teils einer Zeichenkette in C
- 6. C# Optimieren des Codes
- 7. C#: AxWMPLib - Wiedergabe eines Teils eines Songs
- 8. Ausschneiden eines Teils des Videos - Python
- 9. Wiederverwendung eines Teils des Grails-Kriterienabschlusses
- 10. Rendern eines Teils des Codes (tablesorter mit selectize) jedes Mal, wenn ich eine React-Komponente lade
- 11. C#: Wie Sie einen Screenshot eines Teils des Bildschirms nehmen
- 12. C# Code Größe und Code Ausführungszeit
- 13. Ausgabe eines Teils eines Objekts
- 14. Filter Top 5 verwendeten Codes SSR
- 15. Wrapping eines C++ Codes mit Objective-C++
- 16. Extrahieren eines Teils eines Bildes in LabView
- 17. Leistung des kompilierten Ausdrucksbaums
- 18. ungerade kompilierten Code
- 19. .NET CIL-Code Größe
- 20. Wie Debuggen/Einbrechen in codedom kompilierten Code
- 21. Anzahl des Teils in Spalt in Excel
- 22. Warum ändert dieser Code die Codes in den richtigen Fall?
- 23. Verwenden eines Teils eines Feldwerts in TSQL
- 24. Warum wird die Ausführung eines Teils des aus einer externen Datei geladenen Codes nicht durch DEP angehalten?
- 25. Ändern eines Variablennamens innerhalb des Codes
- 26. Größe des QR-Codes generiert von mailmergebarcode in ms Wort
- 27. Ändern eines Teils eines Spaltennamens in Pandas?
- 28. Die Höhe eines ausgewählten HTML-Codes zurücksetzen
- 29. Finden Sie die Größe jedes kompilierten Moduls in Python virtualenv?
- 30. Was ist die Ausgabe des folgenden Codes in c? Warum?
Ja. Eine Variable verwendet keine Anweisungen. –
Aber der Aufruf an den Konstruktor verwendet Anweisungen. –
Das zu fragen macht nicht viel Sinn. Was zielst du eigentlich? – wilx