3 Stimmen

Von den Funktionen beanspruchter Speicher

Ich habe eine Voxel-Klasse, die eine halbe Million Mal erstellt wird. Ich habe die Datenmenge reduziert, die ich verwende, aber mir ist gerade aufgefallen, dass ich nicht sicher bin, ob Funktionen ähnlich viel Speicherplatz benötigen wie Variablen. Wie kann ich herausfinden, wie viel Platz eine Funktion in meinem Programm einnimmt? Und noch wichtiger: Wenn ich 500 Instanzen einer Klasse habe, bedeutet das, dass ich 500 Instanzen der Funktion habe?

Ich kann mir vorstellen, dass das höchstwahrscheinlich nicht der Fall ist (ohne Berücksichtigung von Inline-Funktionen), aber eine Erklärung wäre nett.

4voto

Steve Townsend Punkte 52288

Kein Grund zur Panik. Der Code für die meisten Funktionen (ob inline oder nicht) kommt nur einmal in der verknüpften Binärdatei vor.

Schablonenmethoden treten einmal pro Instanziierung auf, da unterschiedliche Schablonenparameter zu unterschiedlichem Code führen.

In diesem Zusammenhang, instantiation bedeutet die Verwendung einer Klassen- oder Funktionsvorlage mit einem bestimmten Satz von Vorlagenparametern in Ihrem Build. Jeder andere Satz von Parametern führt zu einer neuen Instanziierung, wobei bei Klassenvorlagen nur die Mitgliedsfunktionen, die Sie tatsächlich für jede Instanziierung verwenden, in Ihr endgültiges Binärabbild aufgenommen werden. Mehr Hintergrund aquí .

Stellen Sie für Visual Studio sicher, dass Sie die Generierung von Link-Time-Code da dies die Größe des Codes weiter reduzieren kann, indem der gesamte Funktionssatz zur Verknüpfungszeit überprüft wird, zusätzlich zu den üblichen Optimierungen zur Kompilierzeit die Sie bereits voll ausgeschöpft haben sollten. Sie können auch verwenden /OPT:REF zur Verknüpfungszeit, um nicht referenzierte Funktionen auszulassen. Dies ist der Standard für Release-Builds, aber es lohnt sich, dies zu überprüfen.

3voto

wallyk Punkte 55322

Nein, es gibt nur eine Instanz der Funktion pro Template-Iteration. Alle Objekte einer Klasse verweisen auf die gleiche Funktionsinstanz.

Die Bestimmung der Codegröße der Funktion ist nicht trivial. Die Generierung einer Link-Map ist das allgemeinste Mittel zur Bestimmung der Funktionsgröße, aber es erfordert eine gewisse Ausbildung, um sie zu lesen.

2voto

Nikolai Fetissov Punkte 79627

Es sei denn, Sie haben virtuelle Funktionen in dieser Klasse - nein, Mitgliedsfunktionen nehmen keinen Platz in der Klasseninstanz ein. Bei virtuellen Funktionen hat jede Instanz einen einzigen Zeiger auf virtuelle Funktionstabelle .

1voto

dnadlinger Punkte 5483

Was bei der Erstellung eines neuen Objekts Platz wegnimmt, sind die Objektdaten, nicht der Maschinencode der Operationen auf diesen Daten - wenn Sie wollen, können Sie sich die Mitgliedsfunktionen als "normale", freie Funktionen vorstellen, denen implizit ein this Zeiger.

Vom Standpunkt des Codegen aus gesehen gibt es zum Beispiel kaum einen Unterschied zwischen

struct A { int x; void foo(); };

et

struct A {};
void foo( A* self );

.

Für virtuelle Funktionen ist dies nicht ganz richtig, da jede virtuelle Funktion einen Zeiger auf die vtable hinzufügt, aber das ist eine andere Geschichte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X