2010-05-29 2 views
0

Que se passe-t-il, étape par étape, lorsqu'une variable est retournée? Je sais que si c'est un built-in et qu'il s'intègre, il est jeté dans rax/eax/ax. Que se passe-t-il quand il ne rentre pas et/ou n'est pas intégré? Plus important encore, existe-t-il un appel de constructeur de copie garanti?En C++, que se passe-t-il lorsque vous renvoyez une variable?

edit: Qu'en est-il du destructeur? Est-ce que cela s'appelle «parfois», «toujours» ou «jamais»?

+3

Dépend des conventions du système d'exploitation. – WhirlWind

Répondre

7

Lorsque la valeur de retour est stockée dépend entièrement de calling convention et est très spécifique à l'architecture et au système.

Le compilateur est autorisé à élider l'appel au constructeur de copie (c'est-à-dire qu'il n'a pas besoin d'appeler le constructeur de copie). Notez que renvoyer une valeur d'une fonction peut également appeler un opérateur d'affectation, en fonction de ce qui est fait avec la valeur de retour d'une fonction.

+0

Le destructeur est-il jamais appelé pour la version locale? –

+0

@wowus: Non, car il n'y a pas vraiment de "version locale". Si l'appel au constructeur de copie est annulé, alors l'objet renvoyé est construit sur place dans la valeur de retour. –

+0

@wowus: S'il n'y a pas de copie, appeler le destructeur rendra cette instance invalide. – kennytm

2

Si le type de retour fonction/méthode est une référence, alors aucune copie n'a lieu. S'il s'agit d'un type de renvoi sans référence, une copie peut avoir lieu en en fonction de la convention d'appel de votre plate-forme.

Dans les architectures riches en registre (typiquement RISC), il peut y avoir une allocation généreuse de registres pour contenir des structures de retour modestes. Ceci afin d'éviter des transactions de mémoire excessives qui sont coûteuses par rapport aux transactions de cache/registre. Sur la famille Intel intel x86 que votre question implique par les registres que vous mentionnez, il est plus probable que sur un RISC d'appeler un constructeur de copie.

Questions connexes