Betrachten Sie folgenden Code:Wie ermittelt der Compiler die benötigte Stackgröße für eine Funktion mit vom Compiler generierten Provisorien?
class cFoo {
private:
int m1;
char m2;
public:
int doSomething1();
int doSomething2();
int doSomething3();
}
class cBar {
private:
cFoo mFoo;
public:
cFoo getFoo(){ return mFoo; }
}
void some_function_in_the_callstack_hierarchy(cBar aBar) {
int test1 = aBar.getFoo().doSomething1();
int test2 = aBar.getFoo().doSomething2();
...
}
In der Zeile, in getFoo() der Compiler ein temporäres Objekt von cFoo generiert genannt wird, doSomething1 nennen zu können(). Verwendet der Compiler den Stapelspeicher, der für diese temporären Objekte verwendet wird? Wie viele Stapelspeicher wird der Aufruf von "some_function_in_the_callstack_hierarchy" reservieren? Speichert es Speicher für jedes generierte temporäre Objekt?
Meine Vermutung war, dass der Compiler nur Erinnerung an cFoo für ein Objekt reservieren und den Speicher für verschiedene Anrufe wiederverwenden, aber wenn ich
int test3 = aBar.getFoo().doSomething3();
hinzufügen kann ich sehen, dass die benötigte Stack-Größe für „some_function_in_the_callstack_hierarchy“ ist viel mehr und es ist nicht nur wegen der zusätzlichen lokalen int-Variable.
Auf der anderen Seite, wenn ich dann
cFoo getFoo(){ return mFoo; }
mit einem Referenz ersetzen (nur für einen bestimmten Zweck zu testen, weil ein Verweis auf ein privates Mitglied Rückkehr ist nicht gut)
const cFoo& getFoo(){ return mFoo; }
es braucht Weg weniger Stapelspeicher, als die Größe eines cFoo.
Also für mich scheint es, dass der Compiler zusätzlichen Stack-Speicher für jedes generierte temporäre Objekt in der Funktion reserviert. Aber das wäre sehr ineffizient. Kann jemand das erklären?
Es ist ziemlich Implementierung-definiert. Es ist nicht einmal garantiert, dass Objekte mit automatischem Speicher überhaupt auf dem Stapel erstellt werden. – SingerOfTheFall
Nur für den Fall, dass Sie nicht sicherstellen, dass Sie mit etwas wie "-O2" aktiviert kompilieren. Das Analysieren eines nicht optimierten Builds ist nicht sehr hilfreich. – NathanOliver
Es ist kompiliert mit -O1 – Matthias