Iradrille , j'essaie de faire le point sur ce que tu as écrit :

Envoyé par
Iradrille
1 2 3 4 5 6
| int foo() {
int ret = 3;
return ret;
}
// et
int foo() { return 3; } |
C'est strictement équivalent. Donc pas de copie supplémentaire ici.
c'est équivalent parce que 3 est reconnu comme un objet de type int j'imagine: Dans le deuxième cas, même si on écrit "return 3;" uniquement, ça sous-entend la création d'un objet de type int, et finalement ça revient au même que le premier cas. vrai ?

Envoyé par
Iradrille
1 2 3 4 5 6
| int foo() { return 3; }
int a = foo();
// et
int foo(int& a) { a = 3; }
int a;
foo(a); |
C'est aussi équivalent, dans les deux cas la fonction sera inline et le tout sera équivalent à
int a = 3;.
Je suppose, pour la 2ème déclaration de foo, que tu voulais déclarer foo plutôt comme ceci :
void foo(int& a) { a = 3; }
Supposons que la fonction ne soit pas inline. Les équivalences sont encore valables. Vrai ? Dans tous les cas, un objet de type int est créé temporairement dans la fonction.

Envoyé par
Iradrille
Il y à de rare cas où la première forme forcera une copie supplémentaire par contre.
En fait je ne comprends plus trop du coup la remarque de Luc Hermitte à l'époque, sur la copie des 3 éléments :

Envoyé par
Luc Hermitte
- std::vector<>, qui permet d'avoir une taile de la zone contenue variable ; par contre copie des 3 éléments aussi je le crains.
Que voulait-il dire à l'époque ?
J'ai d'autres questions sur les réponses de JolyLoic, jblecanard, mais là faut je bosse. J'ai un peu peur aussi d'abuser de votre temps et de vous polluer avec plein de messages ! Ca m'intéresse !
Merci encore
Partager