56 votes

Pourquoi un objet renvoyé par valeur a-t-il la même adresse que l'objet à l'intérieur de la méthode ?

#include <stdio.h>
#include <array>
#include <vector>

std::vector<int> foo() {
 int i;
 std::vector<int> a(100);
 printf("%p, %p, %p\n", &i, &a, &(a[0]));
 return a;
}

int main() {
 int i;
 std::vector<int> b = foo();
 printf("%p, %p, %p\n", &i, &b, &(b[0]));
}

Pourquoi a et b ont la même adresse pour ce qui précède ? Est-ce une sorte d'optimisation "cross-stack-frame" ? Le résultat est le même même lorsque j'utilise l'option -O0

Le résultat:

 $ vim main.cpp 
$ cc -std=c++11 -lc++ main.cpp
$ ./a.out
0x7ffee28d28ac, 0x7ffee28d28f0, 0x7ff401402c00
0x7ffee28d290c, 0x7ffee28d28f0, 0x7ff401402c00
$ 

15voto

R.. Points 93718

Notez que même sans élision de copie (obligatoire ou non), il est déjà possible que les adresses des deux objets soient les mêmes car leurs durées de vie ne se chevauchent pas.

8voto

Hikmat Farhat Points 554

comme les autres l'ont expliqué, c'est à cause de la copie elison. Vous pouvez désactiver cela avec g++ en :

 g++ -fno-elide-constructors main.cpp

main.cpp contient votre code.

maintenant a et b ont des adresses différentes mais a[0] et b[0] auront la même adresse à cause de la sémantique du mouvement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X