struct & fonctions

struct & fonctions - C++ - Programmation

Marsh Posté le 19-11-2002 à 12:01:33    

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 )-
Reply

Marsh Posté le 19-11-2002 à 12:01:33   

Reply

Marsh Posté le 19-11-2002 à 12:51:43    

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.

Reply

Marsh Posté le 19-11-2002 à 13:59:48    

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 )-
Reply

Marsh Posté le 19-11-2002 à 14:13:56    

: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!
Reply

Marsh Posté le 19-11-2002 à 14:19:48    

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 )-
Reply

Marsh Posté le 19-11-2002 à 14:20:48    

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


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

Marsh Posté le 19-11-2002 à 14:34:21    

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!
Reply

Marsh Posté le 19-11-2002 à 16:05:00    

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 )-
Reply

Marsh Posté le 19-11-2002 à 16:05:46    

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


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

Marsh Posté le 19-11-2002 à 19:12:16    

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 )-
Reply

Marsh Posté le 19-11-2002 à 19:12:16   

Reply

Marsh Posté le 19-11-2002 à 19:28:44    

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.

Reply

Marsh Posté le 19-11-2002 à 20:21:23    

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 )-
Reply

Marsh Posté le 19-11-2002 à 20:22:11    

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 )-
Reply

Marsh Posté le 19-11-2002 à 23:49:45    

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
Reply

Marsh Posté le 20-11-2002 à 10:24:51    

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
Reply

Marsh Posté le 20-11-2002 à 10:33:01    

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!
Reply

Marsh Posté le 21-11-2002 à 18:04:38    

mci, je cours voir :)


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

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed