Considérez le code suivant :
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();
...
}
Dans la ligne où getFoo() est appelé, le compilateur va générer un objet temporaire de cFoo, pour pouvoir appeler doSomething1(). Le compilateur réutilise-t-il la mémoire de la pile qui est utilisée pour ces objets temporaires ? Combien de mémoire de pile l'appel de "some_function_in_the_callstack_hierarchy" va-t-il réserver ? Est-ce qu'il réserve de la mémoire pour chaque objet temporaire généré ?
Je pensais que le compilateur ne réservait de la mémoire que pour un seul objet de cFoo et qu'il réutiliserait la mémoire pour différents appels, mais si j'ajoute
int test3 = aBar.getFoo().doSomething3();
Je peux voir que la taille de la pile nécessaire pour "some_function_in_the_callstack_hierarchy" est beaucoup plus importante et ce n'est pas seulement à cause de la variable int locale supplémentaire.
Par contre, si i remplace alors
cFoo getFoo(){ return mFoo; }
avec une référence (uniquement à des fins de test, car renvoyer une référence à un membre privé n'est pas bon)
const cFoo& getFoo(){ return mFoo; }
il a besoin de beaucoup moins de mémoire de pile, que la taille d'un cFoo.
Pour moi, il semble donc que le compilateur réserve de la mémoire de pile supplémentaire pour chaque objet temporaire généré dans la fonction. Mais cela serait très inefficace. Quelqu'un peut-il expliquer cela ?