Ce que je comprends, c'est que cela ne devrait pas être fait, mais je crois avoir vu des exemples qui font quelque chose comme ceci (notez que le code n'est pas nécessairement syntaxiquement correct mais l'idée est là)
typedef struct{
int a,b;
}mystruct;
Et puis voici une fonction
mystruct func(int c, int d){
mystruct retval;
retval.a = c;
retval.b = d;
return retval;
}
J'ai compris que nous devions toujours renvoyer un pointeur vers une structure malloc'ed si nous voulons faire quelque chose comme ça, mais je suis sûr d'avoir vu des exemples qui font quelque chose comme ça. Est-ce correct ? Personnellement, je renvoie toujours un pointeur vers une structure mallocée ou je passe simplement par référence à la fonction et je modifie les valeurs à cet endroit. (Parce que si je comprends bien, une fois que la portée de la fonction est terminée, la pile utilisée pour allouer la structure peut être écrasée).
Ajoutons une deuxième partie à la question : Cela varie-t-il selon le compilateur ? Si c'est le cas, quel est le comportement des dernières versions des compilateurs pour ordinateurs de bureau : gcc, g++ et Visual Studio ?
Des idées sur la question ?
35 votes
"Ce que je comprends, c'est que ça ne devrait pas être fait", dit qui ? Je le fais tout le temps. Notez également que le typedef n'est pas nécessaire en C++, et qu'il n'existe pas de "C/C++".
4 votes
La question semble être pas être ciblé sur le c++.
5 votes
@PlasmaHH Copier de grandes structures peut être inefficace. C'est pourquoi il faut être prudent et bien réfléchir avant de retourner une structure par valeur, surtout si la structure a un constructeur de copie coûteux et que le compilateur n'est pas bon pour optimiser la valeur de retour. J'ai récemment optimisé une application qui passait une grande partie de son temps dans des constructeurs de copie pour quelques grandes structures qu'un programmeur avait décidé de retourner par valeur partout. Cette inefficacité nous coûtait environ 800 000 dollars en matériel de centre de données supplémentaire que nous devions acheter.
9 votes
@Crashworks : Félicitations, j'espère que votre patron vous a donné une augmentation.
0 votes
@PlasmaHH C'était une optimisation évidente ; en fait, ce n'est pas tant Larry qui nous a fait économiser de l'argent que Larry qui nous en a fait perdre. Le fait est que le retour par la valeur est le type d'inefficacité qui est significatif.
6 votes
@Crashworks : bien sûr que c'est mauvais de toujours retourner par valeur sans réfléchir, mais dans les situations où c'est la chose la plus naturelle, il n'y a généralement pas d'alternative sûre qui ne nécessite pas une copie, donc retourner par valeur est la meilleure solution car elle ne nécessite pas d'allocation de tas. Souvent, il n'y aura même pas être une copie, en utilisant un bon compilateur l'élision de copie devrait intervenir quand c'est possible et dans C++11, la sémantique de déplacement peut éliminer encore plus de copie profonde. Ces deux mécanismes ne fonctionneront pas correctement si vous faites quoi que ce soit sinon mais le retour par valeur.
0 votes
C'est faux. Les langages qui s'appellent C/C++ faire existent.
0 votes
Cette question Pourquoi le code C ne renvoie pas une structure a quelques réflexions sur la question du retour d'une structure ainsi que cette question Retourner une structure à partir d'une fonction en C
0 votes
"J'ai compris que nous devions toujours retourner un pointeur vers une structure mallocalisée" - NOPE NOPE NOPE NOPE NOPE NOPE. C'est tout simplement faux. Si vous n'avez pas besoin d'un pointeur, vous ne devriez pas en utiliser un "juste parce que"