8
votes

Est-ce une bonne pratique pour réussir l'objet de struct comme paramètre à une fonction de C ++?

J'ai essayé un exemple en direct ci-dessous: xxx

Le résultat imprimé est: xxx

ce que je m'attendais. Ma question est la suivante: le paramètre p reçoit-il la copie complète de l'objet P1? Si oui, je me demande si c'est une bonne pratique? (J'ai supposé que lorsque la structure est de taille importante, cela créera beaucoup de frais de copie).


2 commentaires

Il existe de nombreuses autres questions sur les différences et les compromis entre la valeur et la réussite par référence. Par exemple. Stackoverflow.com/questions/2627166 / ...


En C ++, vous n'avez pas besoin de faire Typedef Struct Point {...} Point; . Juste faire struct point {...}; .


6 Réponses :


18
votes

Oui, il n'y a rien de mal à cela et oui, p code> est une copie complète de p1 code>. Je n'appelerais pas un struct code> avec deux int code> s gros, mais si le struct code> devient grand et si vous n'avez pas besoin de modifier Dans le corps de la fonction, vous pourriez envisager de le transmettre par const Référence:

void cp(const point& p)
{
    // ...
}


0 commentaires

1
votes
void cp(point *p){
}

2 commentaires

point * est par pointeur, plutôt que par référence. Comme il s'agit d'une question C ++, c'est une différence significative.


Java est en fait une valeur de passage, bien que c'est une autre question;)



1
votes

En vous case, la structure ponctuelle est transmise «par valeur», que toute la structure est copiée. Pour les grands types de données, cela peut en effet être lent.

Vous pouvez envisager de passer l'objet par référence xxx

ou être const référence xxx < / pré>


0 commentaires

1
votes

Voir les possibilités pour éviter de passer des objets par valeur. L'objet n'est pas seulement "copié", mais la copie est construite. Cela implique donc d'appeler Copy Constructor et la chaîne de copie constructeurs si votre objet est composé ou dérivé d'autres objets. Passer par référence si possible.

void cp (point et p const) const { xxx

}


4 commentaires

Votre utilisation du const est faux ici. Il devrait être void cp (const point et p) comme d'autres disent.


Notez que le paramètre doit être const point et p si vous n'allez pas le modifier. Mettre le const après la partie de déclaration et avant que le { est la bonne chose à faire pour une fonction de membre qui ne change pas l'objet.


Je ne recommanderais pas toujours passer par référence. Il y a un compromis et ce n'est pas toujours clairement clairement favorable à la référence. Le fait que les références puissent faire référence à l'objet global signifie qu'il existe des optimisations qui ne peuvent pas être effectuées dans le corps de fonction qui pourraient être effectuées avec des paramètres copiés. La copie peut être très bon marché (il n'y a pas de copy-constructeurs dans ce cas et en fonction de la convention appelante, la «copie» pourrait simplement être une charge dans des registres.


Désolé pour l'erreur les gars. Je suis d'accord avec les commentaires sur la constante. La contrainte sur les références est destinée aux objets composés pouvant entraîner plusieurs constructions. Dans ce cas, oui, j'accepte que la réussite de la valeur peut optimiser mieux.



6
votes

avant de donner une réponse à votre question forte> (vous le trouvez à la fin de ce poste), voici un bref résumé des possibilités que vous avez pour passer des arguments à une fonction:


1. Objets construits de la copie (PASS-BY-VALUE): STRAND> P>
void cp(const point* p);


0 commentaires

8
votes

Il n'y a rien de mal à passer des structs en tant que paramètres. Tout est passé par la valeur en C ++, une copie complète est effectivement faite.

La structure que vous avez donnée dans votre exemple est petite, donc ce n'est probablement pas un problème si vous ne posez probablement pas de problème. Mais si vous travaillez avec des structures de données plus grandes, vous voudrez peut-être le transmettre par référence.

méfiez-vous, passant par référence signifie que si vous modifiez la structure dans votre fonction, votre structure d'origine sera modifiée. Assurez-vous d'utiliser le mot-clé Const dans chaque cas où vous ne modifiez pas la structure. Cela vous donnera une information immédiate sur si vos fonctions modifient les informations ou non.

Votre exemple pourrait être modifié pour fonctionner avec des références de cette façon: xxx < / p>


3 commentaires

Tout n'est pas transmis par la valeur en C ++, bien que ce soit le cas en C (qui n'a pas de références).


Eh bien, dans les déclarations de fonction, tout est transmis par la valeur que si vous le précisez. Ceci est très différent de la plupart des langues modernes dans lesquelles des objets sont passés automatiquement par référence. Cependant, vous pouvez transmettre un paramètre par référence à une fonction sans le savoir car la sémantique est la même.


Quelqu'un peut-il me faire savoir, pourquoi au-dessus du code ne peut pas être compilé par C compilateur C?