Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1007 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  struct & fonctions

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

struct & fonctions

n°248268
blackgodde​ss
vive le troll !
Posté le 19-11-2002 à 12:01:33  profilanswer
 

si je déclare une fonction ds une struct :

Code :
  1. struct MYSTRUCT
  2. {
  3.   int var;
  4.   void MyFunc(int i) {var = i;}
  5. };


 
lorsqu'on "instancie" (je c pas si ca se dit pour les struct) la structure, le code de la fonction est-il copié ou est-ce seulement un pointeur ?


---------------
-( BlackGoddess )-
mood
Publicité
Posté le 19-11-2002 à 12:01:33  profilanswer
 

n°248322
BifaceMcLe​OD
The HighGlandeur
Posté le 19-11-2002 à 12:51:43  profilanswer
 

En C++, une struct est une classe. La seule et unique différence entre les deux, c'est la visiblité par défaut des membres, qui est publique pour une struct et privée pour une classe. A part ça, c'est strictement la même chose.
 
Pour répondre précisément à ta question, "dupliquer" la fonction n'a aucun sens. Les données et le code sont gérées totalement différemment en C++ : le code est toujours chargé en un seul exemplaire en mémoire ; par contre, chaque instance d'objet à une zone mémoire qui lui est propre, zone mémoire suffisamment grande pour contenir tous les attributs ("champs membres" en C++) de l'objet.

n°248371
blackgodde​ss
vive le troll !
Posté le 19-11-2002 à 13:59:48  profilanswer
 

en fait donc ds chaque instance de la struct, les membres seront représentés par des pointeurs vers le code, est-ce exact ?
 
sinon, une class accepte un Ctor, un Dtor, est-ce pareil pour une struct ?


---------------
-( BlackGoddess )-
n°248381
YungMakko
Posté le 19-11-2002 à 14:13:56  profilanswer
 

:non:  Ce n'est pas exactement ça!
 
Dans ton code exemple, ta fonction est "inline", c'est à dire que le code de la fonction sera dupliquée à l'endroit de l'appel de la dite fonction. Ce qui a pour conséquence, un code plus important en mémoire (quoi que là, vu la fonction, ça ne change rien), mais cela evitera l'appel de la fonction, donc gain de vitesse.


---------------
In tartiflette, we trust!
n°248390
blackgodde​ss
vive le troll !
Posté le 19-11-2002 à 14:19:48  profilanswer
 

alors donc (chui un peu long a comprendre, mais je veux etre sur d'avoir compris :p)
 
si je déclare :  

Code :
  1. struct MYSTRUCT
  2. {
  3. int var;
  4. void MyFunc(int i) {var = i;}
  5. };


 
le code est dupliqué.
 
mais si je déclare :
 

Code :
  1. struct MYSTRUCT
  2. {
  3. int var;
  4. void MyFunc(int i)
  5. };
  6. // puis
  7. MYSTRUCT::MyFunc(int i)  {
  8.   var = i;
  9. }


 
alors la le code ne sera pas dupliqué.
 
est-ce exact ?


---------------
-( BlackGoddess )-
n°248392
blackgodde​ss
vive le troll !
Posté le 19-11-2002 à 14:20:48  profilanswer
 

Code :
  1. //à la place de  
  2. MYSTRUCT::MyFunc(int i)  {
  3. // c'est :
  4. void MYSTRUCT::MyFunc(int i)  {
  5. // ptit oubli


---------------
-( BlackGoddess )-
n°248415
YungMakko
Posté le 19-11-2002 à 14:34:21  profilanswer
 

C'est presque ça, en fait tu auras:
 

Code :
  1. // Appel de la fonction
  2.     MYSTRUCT   myStruct;
  3.     ...
  4.     myStruct.MyFunc(15);
  5.     ...
  6. // Sera transformé en quelque chose d'equivalent à:
  7.     MYSTRUCT   myStruct;
  8.     ...
  9.     myStruct.var = 15;
  10.     ...


 
Tu peux faire la même chose en declarant ta fonction "inline":
inline void MyFunc(int i);
 
et en implementant le code dans ton .cpp ;
Cela dit, attention à l'utilisation des inlines, tous les compilateurs ne le gère pas de la même manière, et quelque fois tu peux avoir des problèmes de linkage dans des projets complexes.


---------------
In tartiflette, we trust!
n°248533
blackgodde​ss
vive le troll !
Posté le 19-11-2002 à 16:05:00  profilanswer
 

g pas tres bien compris ...
 
deja une fonction d'une struct s'implemente-t-elle comme une classe ? avec MyStruct::MyFunc(...) ?
 
sinon le inline, ok g compris ca va bien m'aider merci :)


---------------
-( BlackGoddess )-
n°248535
blackgodde​ss
vive le troll !
Posté le 19-11-2002 à 16:05:46  profilanswer
 

ah si c bon en relisant une 3eme fois g compris :)


---------------
-( BlackGoddess )-
n°248926
blackgodde​ss
vive le troll !
Posté le 19-11-2002 à 19:12:16  profilanswer
 

ouais ... justement je cherche l'inverse ... que la fonction reste ds la struct, est-ce possible ? (en plus sur vc++ le inline est implicit si on debug ... c pratique ca tiens ...)


---------------
-( BlackGoddess )-
mood
Publicité
Posté le 19-11-2002 à 19:12:16  profilanswer
 

n°248954
BifaceMcLe​OD
The HighGlandeur
Posté le 19-11-2002 à 19:28:44  profilanswer
 

Comme j'avais dû mal comprendre ton expression "instancier la structure", je précise, au cas où : ce que yungmakko t'a expliqué arrive quand on appelle la fonction membre MyFunc(), pas quand on instancie MYSTRUCT (c'est-à-dire quand on crée un objet de type MYSTRUCT).
 
Note : si tu constates que VC++ inline ta méthode, vérifie dans les options du compilateur : les options d'optimisation doivent être activées. Désactive-les et cela devrait s'arranger.

n°248996
blackgodde​ss
vive le troll !
Posté le 19-11-2002 à 20:21:23  profilanswer
 

g pris comme exemple de struct :
 

Code :
  1. struct StructTest
  2. {
  3. int var;
  4. void FuncTest(int i);// {i++; i=i-i; i=i*i; var=i;}
  5. };


 
et g beau désactiver toutes les optimisations que je trouve, sizeof(StructTest) est tjs égal à 4 ce qui correspond à sizeof(int).
 
(Toutes les opérations sur i sont juste pour que le code prenne un peu de place)


---------------
-( BlackGoddess )-
n°248997
blackgodde​ss
vive le troll !
Posté le 19-11-2002 à 20:22:11  profilanswer
 

zut, g oublié un bout :  

Code :
  1. void StructTest::FuncTest(int i)
  2. {
  3. i++; i=i-i; i=i*i; var=i;
  4. }


---------------
-( BlackGoddess )-
n°249162
Musaran
Cerveaulté
Posté le 19-11-2002 à 23:49:45  profilanswer
 

Le code n'est pas dans les objets de classe, mais il est accessible via la classe.
 
Les fonctions dans une classe/structure, c'est juste un moyen d'organisation pour le programmeur.
Les membres de données consituent le contenu effectif de chaque instance (oui, c'est comme ça qu'on dit) de cette classe.
Les fonctions sont toujours globales (même s'il y a des restrictions d'accès), C++ ne gère pas le code dynamique, seulement les appels dynamiques.
Les méthodes ont ceci de spécial qu'elles ont un premier argument implicite pointeur sur l'objet les appelant.
Inline est un concept différent, qui vient en plus.
 
Bref:

Code :
  1. struct MYSTRUCT{
  2. int var;
  3. void MyFunc1(int i); //simple déclaration
  4. void MyFunc2(int i) {var = i;} //définition inline
  5. };
  6. void MYSTRUCT::MyFunc1(int i){ //implicitement void MyFunc1(MYSTRUCT* this, int i)
  7. var = i; //implicitement this->var = i
  8. }
  9. MYSTRUCT ms;
  10. ms.MyFunc1(1); ////implicitement MyFunc1(&ms, 1)


On peut obtenir un appel dynamique avec les méthodes virtuelles, les pointeurs de fonctions ou les pointeurs de méthodes.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°249271
BifaceMcLe​OD
The HighGlandeur
Posté le 20-11-2002 à 10:24:51  profilanswer
 

Donc je ne m'étais pas trompé sur ta question.
 
Comme l'a dit Musaran, et comme je l'ai dit moi-même, le code et les données sont gérés de façon totalement différente, et en mémoire, ils sont de toute manière totalement séparés. Comme je le disais, le code de l'ensemble des fonctions est en un seul et unique exemplaire quelque soit le nombre d'instances de ta structure/classe.
 
Donc c'est normal que "sizeof" ne revoit que la taille des données. On ne se préoccupe (quasiment) jamais de la taille du code en mémoire dans son programme.


Message édité par BifaceMcLeOD le 20-11-2002 à 10:25:58
n°249275
YungMakko
Posté le 20-11-2002 à 10:33:01  profilanswer
 

Pour une explication claire et complète de la taille des objets en C++, voir l'excellent article (consacré à ATL, mais le début est générique):
http://www.codeproject.com/atl/atl_underthehood_.asp
 


---------------
In tartiflette, we trust!
n°250865
blackgodde​ss
vive le troll !
Posté le 21-11-2002 à 18:04:38  profilanswer
 

mci, je cours voir :)


---------------
-( BlackGoddess )-

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  struct & fonctions

 

Sujets relatifs
pb de poinreur lors d'appel de fonctionsfonctions graphiques en C
Declarations de fonctions et temps d'executions du script...Où sont les fonctions trigo ? [résolu]
Pointeurs sur fonctions (question pointue !)struct tableau ds 1 fonction ...
structure d'une base de donnés sql pour un forum et fonctions innovant[C] Help !! pb avec fonctions
[PHP] Probleme avec les fonctionsObjets, Classes, Fonctions avec objets en paramétres, *, & :Prob.
Plus de sujets relatifs à : struct & fonctions


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR