5 votes

C++ : Passer un struct contenant un tableau comme arg, dois-je passer comme pointeur ?

Si j'ai une structure comme ça :

struct S
{
    int arr[10];
    int x;
}

Si j'ai une fonction

void some_fun( struct S myS );

Le tableau sera-t-il copié correctement si je passe un struct S à cette fonction ou dois-je modifier la fonction en :

void some_fun( struct S * myS ); ?

J'ai testé cela (et cela fonctionne sans pointeur) mais je ne suis pas très sûr du C/C++, parfois cela fonctionne même si c'est faux.

6voto

dasblinkenlight Points 264350

Le tableau sera-t-il copié correctement si je passe un struct S à cette fonction ?

Oui, il sera copié.

dois-je changer la fonction en : void some_fun( struct S * myS )

Vous pouvez le faire pour trois raisons :

  • Vous voulez éviter de copier - passer un pointeur est plus économique
  • Vous voulez apporter des modifications à la structure à l'intérieur some_fun - Les pointeurs vous permettent de le faire ; le passage par valeur ne permet pas de le faire.
  • Vous voulez réduire le risque de débordement de pile. - si le tableau est grand, passer par valeur peut faire déborder la pile. Le passage par pointeur réduit considérablement ce risque.

EDIT : Puisqu'il s'agit de C++, vous avez la possibilité de passer l'option struct par référence :

void some_fun( S& myS ) // struct keyword is optional in C++

o

void some_fun( const S& myS ) // Do this if you do not plan on modifying myS

Le passage par référence évite la copie d'une manière similaire au passage par pointeur. Contrairement au passage par un pointeur, le passage par référence indique au lecteur que l'élément struct transmis fait référence à un endroit quelconque de la mémoire, alors que les pointeurs vous donnent la possibilité de transmettre une NULL .

1voto

codeling Points 6542

Si vous passez par valeur, comme vous le faites actuellement, votre tableau sera copié par la fonction Constructeur de copie par défaut (voir, par exemple, ici : Comment les membres d'un tableau C++ sont-ils traités dans les fonctions de contrôle de la copie ? ).

Si vous décidez de passer par pointeur, seul le pointeur de la même structure sera passé dans la fonction - ainsi votre tableau ne sera pas copié, toute modification apportée au tableau (ou à tout autre membre de la structure) sera répercutée sur l'objet auquel vous accédez en dehors de la fonction.

En fin de compte, ce sont ces éléments qui permettent de décider de l'approche à choisir :

  • Avez-vous besoin d'une copie dans la fonction ? Si non, passer par référence constante serait mieux
  • Faut-il modifier exactement la même structure que celle que vous avez en dehors de la fonction ? Dans ce cas, utilisez l'approche du pointeur (ou de la référence).
  • Avez-vous besoin d'une copie dans la fonction, parce que vous voulez modifier la structure dans la fonction, mais ces changements ne doivent pas se refléter à l'endroit d'appel ? Alors utilisez l'approche pass-by-value que vous utilisez actuellement !

0voto

Blasius Secundus Points 171

Vous avez 3 options :

Version copiée localement :

void some_fun( struct S myS );

Version du pointeur :

 void some_fun( struct S* myS );

Version de référence :

void some_fun( struct S& myS );

Dans les 2 derniers cas, les modifications apportées à myS seront persistantes (affectant l'instance originale). Dans le premier cas, vous aurez une copie locale.

0voto

Paul Evans Points 8997

Il passera un copie de votre structure de données. C'est bien sauf si vous voulez some_fun pour modifier la structure de données que vous transmettez, vous avez besoin d'un pointeur ou d'une référence.

0voto

Zaibis Points 1616

Comme vous mettez un tableau avec une limite const, il n'est plus décidé à l'exécution de la taille de la structure. Donc, dans votre cas, le tableau fait partie de la structure et n'est pas stocké à un autre endroit : Oui, il sera analysé par la fonction !

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