IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Classes et Structures (C++)


Sujet :

C++

  1. #1
    Membre tr�s actif
    Homme Profil pro
    Etudiant en g�nie m�canique
    Inscrit en
    Mars 2011
    Messages
    146
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Etudiant en g�nie m�canique

    Informations forums :
    Inscription : Mars 2011
    Messages : 146
    Par d�faut Classes et Structures (C++)
    Salut!

    J'ai continu� ma lecture, et en arrivant au chapitre qui explique comment utiliser des "classes" en C++, je n'ai pas pu m'emp�cher de penser sans arr�t aux structures.

    Apparemment, les classes sont plus compl�tes que les structures: on peut g�rer l'encapsulation (public/private), y ajouter des fonctions...

    Concr�tement, mes questions sont les suivantes:
    - Est-ce que les classes sont au C++ ce que les structures sont au C (sachant que les classes ont apparemment des possibilit�s plus �tendues).
    - Si dans mes classes, je mettais tout en "public", quelle incidence cela pourrait-il avoir sur mon programme?
    - Les fonctions contenues dans mes classes peuvent-elles y �tre seulement d�clar�es, et impl�ment�es ailleurs dans le programme? (Ou alors je risque de me retrouver avec des classes hyper-grandes si j'ai un code complexe a y int�grer?)

    Merci pour ces petits �claircissements. Si jamais je vais un peu vite (parce que je suis encore en train de lire), contentez-vous de me le signaler et merci de votre compr�hension.

  2. #2
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    �tudiant
    Inscrit en
    F�vrier 2012
    Messages
    788
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : F�vrier 2012
    Messages : 788
    Par d�faut
    Salut

    Voici un d�but de r�ponse via les entr�es de la FAQ


    Citation Envoy� par Armulis Voir le message
    - Est-ce que les classes sont au C++ ce que les structures sont au C (sachant que les classes ont apparemment des possibilit�s plus �tendues).
    En C++, class et struct sont quasiment �quivalents.
    FAQ C++ - Quelle est la diff�rence entre class et struct ?


    Citation Envoy� par Armulis Voir le message
    - Si dans mes classes, je mettais tout en "public", quelle incidence cela pourrait-il avoir sur mon programme?
    Tu vas t'attirer les foudres des autres d�veloppeurs ^^
    Tu vas complexifier l'utilisation de ta classe et si tu veux faire �voluer ta classe sans casser la compatibilit�, �a sera plus difficile (voire impossible).
    FAQ C++ - Qu'est-ce que l'encapsulation ?

    Citation Envoy� par Armulis Voir le message
    - Les fonctions contenues dans mes classes peuvent-elles y �tre seulement d�clar�es, et impl�ment�es ailleurs dans le programme? (Ou alors je risque de me retrouver avec des classes hyper-grandes si j'ai un code complexe a y int�grer?)
    Oui, bien s�r
    FAQ C++ - Comment structurer ma classe en un fichier .h et un fichier .cpp ?

  3. #3
    r0d
    r0d est d�connect�
    Membre exp�riment�

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    4 295
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 4 295
    Billets dans le blog
    2
    Par d�faut
    Quelques pr�cisions suppl�mentaires (juste une addition au message de Ehonn)
    Citation Envoy� par Armulis Voir le message
    - Est-ce que les classes sont au C++ ce que les structures sont au C (sachant que les classes ont apparemment des possibilit�s plus �tendues).
    En fait, classe et structure en c++ c'est la m�me chose. Seule l'accessibilit� par d�faut (public/private) change. En revanche, les classes/structs en C++ �a n'a rien � voir avec les structs en C. En C, la notion d'objet (donc h�ritage, polymorphisme et tout ce qui en d�coule) n'existe pas. Pas plus que la notion de template. Il est possible de simuler un comportement orient� objet en C, mais il faut passer par des m�canismes "artificiels", non natifs, mais au final ce ne sera jamais vraiment la m�me chose.

    Citation Envoy� par Armulis Voir le message
    - Si dans mes classes, je mettais tout en "public", quelle incidence cela pourrait-il avoir sur mon programme?
    L'incidence d'un tel choix est que tu te priverais d'un outil tr�s puissant de la poo, � savoir l'encapsulation. L'encapsulation a plusieurs avantages. En particulier, cela permet de mieux structurer ton programme. Pour un petit programme de 10 lignes, �a n'a aucun sens. Mais d�s que ton programme grandit (et �a va souvent tr�s vite), une bonne encapsulation te permet d'�viter des erreurs, d'ajouter plus rapidement de nouvelles fonctionnalit�s, d'avoir une meilleure vision du code que tu as d�j� �crit, etc.

    Citation Envoy� par Armulis Voir le message
    - Les fonctions contenues dans mes classes peuvent-elles y �tre seulement d�clar�es, et impl�ment�es ailleurs dans le programme? (Ou alors je risque de me retrouver avec des classes hyper-grandes si j'ai un code complexe a y int�grer?)
    C'est m�me un des principe de base du c++: les d�clarations dans les en-t�te (fichier.h), l'impl�mentation dans le fichier source (fichier.cpp). Avec un b�mol, car on ne peut pas vraiment faire �a dans le cas de classes templates.
    C'est un principe parfois critiqu� (le code d'une classe se retrouve s�par� dans 2 fichiers, c'est parfois compliqu� pour les programmeurs qui viennent d'autres langages o� ce n'est pas le cas), mais �a a de nombreux avantages, dont celui que tu cites.

  4. #4
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Salut,

    Juste pour rajouter mon grain de sel (et en mettre une couche suppl�mentaire ):
    Citation Envoy� par r0d Voir le message
    L'incidence d'un tel choix est que tu te priverais d'un outil tr�s puissant de la poo, � savoir l'encapsulation. L'encapsulation a plusieurs avantages. En particulier, cela permet de mieux structurer ton programme. Pour un petit programme de 10 lignes, �a n'a aucun sens. Mais d�s que ton programme grandit (et �a va souvent tr�s vite), une bonne encapsulation te permet d'�viter des erreurs, d'ajouter plus rapidement de nouvelles fonctionnalit�s, d'avoir une meilleure vision du code que tu as d�j� �crit, etc.
    Il faut d'ailleurs constater que, m�me C essaye d'apporter une certaine encapsualtion...

    C'est beaucoup moins �vident qu'en C++, o� la notion d'encapsulation vient "naturellement" avec le paradigme orient� objets, mais c'est n�anmoins faisable. Prend, par exemple, la structure FILE dont on ne sait absolument rien, � part les fonctions qui la manipulent .

    C++ t'offre la possibilit� d'encapsuler les donn�es de mani�re simple et efficace, il serai dommage de ne pas le faire m�me si une classe dans laquelle tout serait public serait strictement � �quivalent � une structure utilisant sa visibilit� par d�faut et contenant les m�me donn�es (et invers�ment une structure o� tout serait priv� serait strictement �quivalent � une classe utilisant sa visibilit� par d�faut et contenant les m�mes donn�es, bien que cela n'aurait pas beaucoup de sens )
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  5. #5
    Membre actif
    Homme Profil pro
    �tudiant
    Inscrit en
    D�cembre 2012
    Messages
    12
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : D�cembre 2012
    Messages : 12
    Par d�faut
    au fait en c++ la classe est ce qu'est la structure en c, mais faut noter que en c++ on peut dire ''class = struct'' et si tu met tout en public dans ta classe et surtout les attributs croit moi tu auras plus d'ennemis que de programmeurs qui font du c++ sur terre donc pas touche a ce niveau: m�thodes en public et attributs en private.

  6. #6
    Membre Expert

    Avatar de germinolegrand
    Homme Profil pro
    D�veloppeur de jeux vid�o
    Inscrit en
    Octobre 2010
    Messages
    738
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de D�me (Auvergne)

    Informations professionnelles :
    Activit� : D�veloppeur de jeux vid�o
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2010
    Messages : 738
    Par d�faut
    Citation Envoy� par bayaola93 Voir le message
    au fait en c++ la classe est ce qu'est la structure en c, mais faut noter que en c++ on peut dire ''class = struct'' et si tu met tout en public dans ta classe et surtout les attributs croit moi tu auras plus d'ennemis que de programmeurs qui font du c++ sur terre donc pas touche a ce niveau: m�thodes en public et attributs en private.
    Balivernes, mettre des attributs en public n'est pas plus idiot que mettre des m�thodes en private. Se priver syst�matiquement de le faire lorsque cela est possible/utile, voil� la v�ritable erreur.

  7. #7
    Inactif  

    Homme Profil pro
    Ing�nieur test de performance
    Inscrit en
    D�cembre 2003
    Messages
    1 986
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Ing�nieur test de performance
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 1 986
    Par d�faut
    Bonjour.

    La diff�rence essentielle en C++ entre une structure et une classe (hormis l'aspect public/private), c'est que l'on peut aligner (niveau m�moire) une structure, mais pas une classe. C'est utile lorsque l'on veut optimiser son code, ou lorsque l'on m�lange code c++ et code assembleur (l'asssembleur n�cessite en g�n�ral un alignement m�moire des donn�es).

    Citation Envoy� par bayaola93 Voir le message
    croit moi tu auras plus d'ennemis que de programmeurs qui font du c++ sur terre donc pas touche a ce niveau: m�thodes en public et attributs en private.
    Je rejoins germinolegrand, en C++ on utilise une structure quand c'est judicieux, et une classe quand c'est judicieux. Les d�veloppeurs C++ n'ont jamais aboli l'utilisation de structure au profit de classe.

    Je pense que tu fais r�f�rence aux d�bats qui disent de toujours prot�ger les variables membres d'une classe C++ par un accesseur. Cela n'a rien � voir avec le d�bat structure/classe.

  8. #8
    Membre Expert

    Avatar de germinolegrand
    Homme Profil pro
    D�veloppeur de jeux vid�o
    Inscrit en
    Octobre 2010
    Messages
    738
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de D�me (Auvergne)

    Informations professionnelles :
    Activit� : D�veloppeur de jeux vid�o
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2010
    Messages : 738
    Par d�faut
    on peut aligner (niveau m�moire) une structure, mais pas une classe.
    J'aimerais beaucoup voir le passage de la norme qui certifie une telle chose...

  9. #9
    Inactif  

    Homme Profil pro
    Ing�nieur test de performance
    Inscrit en
    D�cembre 2003
    Messages
    1 986
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Ing�nieur test de performance
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 1 986
    Par d�faut
    Citation Envoy� par germinolegrand Voir le message
    J'aimerais beaucoup voir le passage de la norme qui certifie une telle chose...
    Je ne conna�t pas le norme � ce sujet, mais la pratique est �loquente :

    http://msdn.microsoft.com/fr-fr/libr.../83ythb65.aspx

    Cela ne parle que de structure, jamais de classe. Cela me para�t logique, on ne peut aligner que des donn�es dont la taille est connue � la compilation, pas des fonctions. Fonctions qui peuvent allouer des tableaux de tailles variables. C'est donc c'est impr�dictible par le compilateur et par le runtime.

    Certes une structure peut contenir des fonctions, je n'ai pas pouss� plus loin la chose. Je parle bien dans le cas de structure de donn�es pures.

    Et une structure qui sert de foncteur ne sera pas destin�e � �tre align�e niveau m�moire, en g�n�ral.

    Apr�s, une classe qui ne contient que des donn�es publiques, sans accesseurs/fonctions, sera certainement alignables en m�moire... Une structure quoi.

  10. #10
    Membre Expert

    Avatar de germinolegrand
    Homme Profil pro
    D�veloppeur de jeux vid�o
    Inscrit en
    Octobre 2010
    Messages
    738
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de D�me (Auvergne)

    Informations professionnelles :
    Activit� : D�veloppeur de jeux vid�o
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2010
    Messages : 738
    Par d�faut


    Les fonctions membres d'une struct/class n'influent en rien sur la taille en m�moire de celle-ci... cela ne peut donc influencer l'alignement de quelconque mani�re. Ce serait d'ailleurs une perte �norme si les classes avec des centaines de fonction �taient plus lourdes .

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    struct A
    {
        int i;
     
        int f();
    };
    c'est la m�me chose que �a :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    struct A
    {
        int i;
    };
     
    int f(A* this_ptr);
    Cela ne parle que de structure, jamais de classe.
    Et pour cause... c'est strictement la m�me chose, pourquoi faire deux fois les m�mes exemples ? D'ailleurs si, �a parle de classe :
    Vous pouvez utiliser __declspec(align(#)) lorsque vous d�finissez struct, union, ou class, ou lorsque vous d�clarez une variable.

  11. #11
    Inactif  

    Homme Profil pro
    Ing�nieur test de performance
    Inscrit en
    D�cembre 2003
    Messages
    1 986
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Ing�nieur test de performance
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 1 986
    Par d�faut
    En effet ce code compile :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
    __declspec(align(8)) class S2 { int a, b, c, d; void test(const int to){ int* t = new int[to]; } };
     
    void main(){
     
      S2 test;
    }
    Mais bon, le compilateur peut aligner a, b, c, d. Mais comment peut-il aligner t ? Il ne conna�t pas sa taille.

  12. #12
    Membre Expert

    Avatar de germinolegrand
    Homme Profil pro
    D�veloppeur de jeux vid�o
    Inscrit en
    Octobre 2010
    Messages
    738
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de D�me (Auvergne)

    Informations professionnelles :
    Activit� : D�veloppeur de jeux vid�o
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2010
    Messages : 738
    Par d�faut
    D'une part ton code montre une alloc dynamique qui se fait sur le tas donc tout ce que �a prend sur la pile c'est la taille d'un pointeur.

    D'autre part, ainsi que je l'ai dit plus haut, la fonction (et encore moins son corps) n'appartient pas � la classe, c'est juste une fonction qui prend un param�tre this cach� et qui est a acc�s aux private, en clair c'est purement du sucre syntaxique.

  13. #13
    R�dacteur/Mod�rateur
    Avatar de JolyLoic
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    5 463
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Yvelines (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 5 463
    Par d�faut
    Citation Envoy� par germinolegrand Voir le message
    Les fonctions membres d'une struct/class n'influent en rien sur la taille en m�moire de celle-ci... cela ne peut donc influencer l'alignement de quelconque mani�re.
    L�ger b�mol (mais je suis d'accord avec le reste) : La premi�re fonction virtuelle d'une classe va modifier la taille des instances de cette classe (typiquement pour y ajouter un pointeur cach� vers une table de fonctions virtuelles).

    Sinon, pour savoir � quoi va ressembler une classe en m�moire, il faut qu'elle soit "standard layout" :
    Citation Envoy� par La norme, 9/7
    A standard-layout class is a class that:
    � has no non-static data members of type non-standard-layout class (or array of such types) or reference,
    � has no virtual functions (10.3) and no virtual base classes (10.1),
    � has the same access control (Clause 11) for all non-static data members,
    � has no non-standard-layout base classes,
    � either has no non-static data members in the most derived class and at most one base class with non-static data members, or has no base classes with non-static data members, and
    � has no base classes of the same type as the first non-static data member.108
    Ma session aux Microsoft TechDays 2013 : D�velopper en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage � la d�couverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'h�sitez pas � me contacter.

  14. #14
    Inactif  

    Homme Profil pro
    Ing�nieur test de performance
    Inscrit en
    D�cembre 2003
    Messages
    1 986
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Ing�nieur test de performance
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 1 986
    Par d�faut
    Prenons un cas pratique. Une fonction assembleur attends des datas qui sont align�es.

    Une fonction d'une classe ne peut pas pr�tendre � cela (conf�re l'allocation dynamique). Une structure le peut, ou une classe aussi, qui se comporte comme une structure... ou comme une classe c'est selon.

    Enfin, ce que je dis c'est que pour aligner des donn�es on utilise des structures, pas des classes. C'est une diff�rence entre struture /classe en C++, que j'ai voulu souligner dans ce d�bat.

    Merci d'avoir pr�cis� qu'on peut aussi aligner une classe. M�me si je pense que cela doit �tre d'une utilisation marginale, dont on ne trouve aucun code source sur internet...

  15. #15
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Citation Envoy� par germinolegrand Voir le message
    on peut aligner (niveau m�moire) une structure, mais pas une classe.
    J'aimerais beaucoup voir le passage de la norme qui certifie une telle chose...
    Tu peux toujours le chercher... il n'existe pas
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  16. #16
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    La seule "explication" que j'y verrai c'est qu'en g�n�ral ce qu'on aligne ce sont des POD, et pour faire un POD classiquement on utilisera une struct.

    Mais �a n'a absolument rien d'une r�gle, je peux faire un �quivalent strict � ma structure POD avec une classe.

    Une fonction d'une classe ne peut pas pr�tendre � cela (conf�re l'allocation dynamique).
    Ha ? Pourquoi ?
    Quel rapport entre l'allocation dynamique et l'alignement ?
    On peut avoir une structure correctement align�e qui ne fasse que stockage de pointeurs.
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

  17. #17
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Citation Envoy� par moldavi Voir le message
    Je ne conna�t pas le norme � ce sujet, mais la pratique est �loquente :

    http://msdn.microsoft.com/fr-fr/libr.../83ythb65.aspx

    Cela ne parle que de structure, jamais de classe.
    Ouh l�...

    Il faut se m�fier des documentations, et c'en est un exemple flagrant.

    D�j�, il faut se rappeler que tout ce qui commence par un (ou deux) underscore "_" est "implementation specific", c'est � dire sp�cifique � un compilateur donn�.

    cet article traitant de __declspec(align), de __alignof et __unalinged, nous sommes clairement en pr�sence d'un article pr�sentant une sp�cificit� propre � visual studio.

    De plus, il faut faire la part des choses des articles traitant du mot cl� struct d'une part et des "strctures de donn�es d�finies par l'utilisateur" dans leur ensemble d'autre part.

    Les "structures de donn�es d�finies par l'utilisateur" (on parle souvent de "type d�fini par l'utilisateur ) dans leur ensemble peuvent �tre de trois type (si on excepte le typedef ou l'alias de type, quel que soit le langage utilis�):
    1. les struct
    2. les class
    3. les union
    La premi�re ligne de l'article pr�cise qu'il parle de la
    pr�cision l'alignement des donn�es d�finies par l'utilisateur
    C'est donc bel et bien un article qui parle de l'alignement des donn�es de "toute structure d�finie par l'utilisateur" dans leur ensemble
    Cela me para�t logique, on ne peut aligner que des donn�es dont la taille est connue � la compilation,
    En effet, il n'est possible d'aligner en m�moire que ce dont la taille est connue � la compilation...

    Mais...
    pas des fonctions.
    Faux: la taille d'une fonction est parfaitement connue � la compilation

    Ce que l'article dit, c'est qu'on ne peut pas aligner les arguments en m�moire, et la raison n'a rien � voir avec le fait que c'est quelque chose propre � une fonction, mais bien au fait que le argument ne finissent pas en m�moire, mais dans la pile d'appel (qui est, techniquement parlant, de la m�moire, mais qui n'a rien � voir avec la m�moire "RAM").

    Meme les
    Fonctions qui peuvent allouer des tableaux de tailles variables.
    ont une taille clairement d�finie � la compilation.

    Autrement, le compilateur serait incapable de placer plus de deux fonctions dans le code binaire ex�cutable g�n�r�.

    Ce qui re�oit le r�sultat de l'allocation dynamique, c'est un pointeur!

    si l'on ne peut effectivement pas pr�voir la taille en m�moire de qui sera effectivement r�serv�e par l'allocation dynamique, on connait par contre parfaitement la taille de ce qui r�cup�rera le r�sultat de cette allocation dynamique: ce sera la taille d'un pointeur.

    Et, quel que soit le type point� par un pointeur, la taille d'un pointeur est parfaitement connue � la compilation
    C'est donc c'est impr�dictible par le compilateur et par le runtime.
    Ben non (cf juste au dessus )

    L'allocation dynamique se r�sume au final � un appel syst�me, car c'est carr�ment le syst�me d'exploitation qui doit g�rer la m�moire allou�e dynamiquement (pour �viter que deux applications distinctes ne se retrouvent � travailler sur des adresses m�moires identiques), mais le r�sultat est parfaitement pr�dictible au niveau de la fonction qui y a recours: Ce que l'on obtient, c'est l'adresse m�moire � laquelle se trouve le premier byte allou�

    Certes une structure peut contenir des fonctions, je n'ai pas pouss� plus loin la chose. Je parle bien dans le cas de structure de donn�es pures.
    Que l'on parle de structure de donn�es"pures" ou de contenant des fonction en plus des donn�es membres, cela ne change strictement rien...

    Les fonctions membres de classes et de structures sont, au niveau du code binaire ex�cutable g�n�r�, strictement assimil�es � des fonctions libres.

    La seule chose, c'est que le compilateur y ajoute silencieusement un pointeur sur l'objet courent (this) et se d�brouille avec cela pour retrouver les diff�rents membres (qu'il s'agisse de donn�es membres ou d'autres fonctions membres )

    Et une structure qui sert de foncteur ne sera pas destin�e � �tre align�e niveau m�moire, en g�n�ral.
    En effet, mais pour une raison tout autre, et dans un cas bien particulier: celui dans lequel ton foncteur ne disposerait d'aucune donn�e membre (tout serait pass� par l'op�rateur () ).

    Dans ce cas, la structure correspondante serait une structure vide, qui est garantie par la norme �tre de taille nulle.

    Mais, la particularit� d'un foncteur n'est pas de ne pas avoir de donn�es membres, c'est, avant tout, de ne pr�senter qu'une seule fonction qui est... l'op�rateur () !

    et comme tout type ayant s�mantique de valeur doit respecter la forme canonique orthodoxe de coplien, le fait d'y rajouter un constructeur (par exemple) ne changera rien car le compilateur le rajouterait automatiquement si on ne le faisait pas nous m�me

    Il m'arrive, par exemple, r�guli�rement de cr�er des foncteurs (compos�s du seul op�rateur () ) auquel je rajoute des donn�es membres et un constructeur
    Apr�s, une classe qui ne contient que des donn�es publiques, sans accesseurs/fonctions, sera certainement alignables en m�moire... Une structure quoi.
    Toutes les structures de donn�es doivent �tre alignables en m�moire. C'est un imp�ratif mat�riel:

    Il faut imp�rativement que le compilateur puisse acc�der � l'adresse m�moire � laquelle se trouve le premier byte correspondant � la structure de donn�es en question.

    Le fait que ce soit une classe, une structure ou m�me une union (dont la seule particularit� est que tous les membres utilise le m�me espace m�moire) ne changera rien

    La seule concession qui est faite (sauf si on force le compilateur � faire autrement) concerne les types primitifs dont la taille est "suffisamment petite pour permettre d'en repr�senter plusieurs dans un accumulateur donn�" (typiquement les char et les short, voire les int pour les architectures 64 bits) car, � ce moment l�, le compilateur peut d�cider de travailler sur un "sous registre" de l'accumulateur en question afin d'y acc�der.

    Et encore, cela doit suivre des r�gles particuli�res, dont la principale est qu'il faut que ces soit des donn�es contig�es en m�moire et de type identique (par exemple : 3 char successifs ou deux short).
    La premi�re donn�e de type diff�rent sera (sauf si on force le compilateur � faire autrement, toujours) se retrouvera premi�re adresse accessible par le compilateur suivant l'adresse (non accessible en elle-m�me) du dernier �l�ment contig�

    PS: j'ai bien conscience d'avoir pris des raccourcis, d'avoir simplifi� les choses, mais le principe global reste malgr� tout correct
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  18. #18
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    D�veloppeur de jeux vid�o
    Inscrit en
    Ao�t 2004
    Messages
    1 717
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur de jeux vid�o
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 1 717
    Par d�faut
    Citation Envoy� par moldavi Voir le message
    Prenons un cas pratique. Une fonction assembleur attends des datas qui sont align�es.

    Une fonction d'une classe ne peut pas pr�tendre � cela (conf�re l'allocation dynamique). Une structure le peut, ou une classe aussi, qui se comporte comme une structure... ou comme une classe c'est selon.

    Enfin, ce que je dis c'est que pour aligner des donn�es on utilise des structures, pas des classes. C'est une diff�rence entre struture /classe en C++, que j'ai voulu souligner dans ce d�bat.

    Merci d'avoir pr�cis� qu'on peut aussi aligner une classe. M�me si je pense que cela doit �tre d'une utilisation marginale, dont on ne trouve aucun code source sur internet...
    Nope.

    Tu t'es juste emm�l� les pinceaux. Peut etre en touchant a d'autres langages (je pense a D et C#).

    Ou alors tu as trop vu de conventions maisons. Dans tous les cas il n'y a pas de debat et class/struct n'a rien a voir avec l'alignement. Parcequ'il n'y a pas de diff�rence entre struct et class autre que les niveaux acces a la compilation. Certains utilisent struct comme une convention pour dire "donnee brute" mais ce n'est qu'une convention et qui en fait n'est qu'un racourcis pour une class aux membres publiques.

    Est-ce que tu peux nous dire si tu te souviens ou tu as eu cette info erron�e?

    Au passage: le C++ n'est defini QUE par la norme, le document standard ISO. Ce n'est pas parceque ton compilateur marche d'une facon que les autres font pareil et que ca corresponds au standard (malheureusement). Quand tu te demandes si un truc est possible, verifier avec le compilateur est une bonne chose, mais verifier ce que dis la norme est beaucoup mieu parcequ'a ce moment la tu apprends la veritee qui doit etre quel que soit le compilateur "en theorie".

  19. #19
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Citation Envoy� par moldavi Voir le message
    Prenons un cas pratique. Une fonction assembleur attends des datas qui sont align�es.
    Oui, parce que c'est une contrainte mat�rielle.

    Le processeur ne peut acc�der au donn�e que s'il dispose d'une adresse qui correspond au premier bit de cette donn�e

    Une fonction d'une classe ne peut pas pr�tendre � cela (conf�re l'allocation dynamique). Une structure le peut, ou une classe aussi, qui se comporte comme une structure... ou comme une classe c'est selon.
    Non!!

    S'il est vrai que tu ne peux pas (forc�ment) d�terminer � la compilation la taille totale qui sera r�serv�e lors d'une allocation dynamique de la m�moire, tu as cependant une certitude garantie:

    L'espace m�moire allou� sera suffisant pour permettre de repr�senter le nombre de donn�es demand� de mani�re contig�e en faisant en sorte que chaque donn�e soit dispose d'une adresse accessible par le processeur.

    C'est, encore une fois, un imp�ratif mat�riel (car, autrement, le processeur ne pourrait pas acc�der � toutes les donn�es) et c'est amplement suffisant pour apporter la pr�dictibilit� voulue.

    En effet, si tu souhaites acc�der au troisi�me �l�ment, il te "suffit" de prendre la premi�re adresse m�moire accessible qui se trouve � trois fois la taille de chaque �l�ment, en partant de l'adresse m�moire du premier.

    Le fait qu'il y ait 3, 5 ou 10 �l�ments n'importe pas ici, et c'est bien la cause de tous les probl�mes li�s au fait d'essayer d'acc�der au onzi�me �l�ment d'un espace m�moire pr�vu pour en compter 10:

    Tu te retrouves alors � une adresse m�moire qui se trouve "� distance suffisante" de l'adresse m�moire du premier �l�ment pour pouvoir pr�tendre contenir les informations relatives � l'�l�ment, alors que cette adresse m�moire peut contenir strictement n'importe quoi

    Mais c'est alors bien plus un probl�me de logique (le fait de demander "un fois de trop" de d�caler l'adresse m�moire � laquelle aller chercher la donn�e) qu'autre chose.
    Enfin, ce que je dis c'est que pour aligner des donn�es on utilise des structures, pas des classes. C'est une diff�rence entre struture /classe en C++, que j'ai voulu souligner dans ce d�bat.
    Faux!!!

    Il n'y a strictement aucune diff�rence en terme d'alignement des donn�es entre une classe et une structure (et l'on pourrait meme parler des �num�rations ici).

    La seule diff�rence qui existe entre une classe et une structure en C++, c'est l'accessibilit� des membres par d�faut � consid�rer au moment de la compilation.

    D'autres langages (C#, par exemple) donnent une s�mantique diff�rente aux classes et aux structures, de mani�re � ce qu'une classe soit syst�matiquement utilis�e pour tout type ayant s�mantique d'entit� et qu'une structure soit syst�matiquement utilis�e pour les types ayant s�mantique de valeur.

    Mais cela n'emp�che absolument pas que les donn�es soient align�es de mani�re strictement similaire (encore une fois, c'est un imp�ratif mat�riel! ), ni de d�cider de d�clarer des variables membres dans une accessibilit� ou une autre, ni m�me de d�cider de d�clarer (et de d�finir) des fonctions dans une accessibilit� ou une autre.
    Merci d'avoir pr�cis� qu'on peut aussi aligner une classe. M�me si je pense que cela doit �tre d'une utilisation marginale, dont on ne trouve aucun code source sur internet...
    Absolument pas... C'est une utilisation classique, normale et n�cessaire, quelle que puisse �tre le langage envisag�, pour la simple et bonne raison que c'est le processeur qui "m�ne la danse" � ce niveau l�, et qu'il doit pouvoir acc�der � l'adresse m�moire � laquelle commence n'importe quelle instance de n'importe quel type de donn�e (exception faite des types primitifs suffisamment petit pour tenir � plusieurs dans un seul et m�me accumulateur)
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  20. #20
    Inactif  

    Homme Profil pro
    Ing�nieur test de performance
    Inscrit en
    D�cembre 2003
    Messages
    1 986
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Ing�nieur test de performance
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 1 986
    Par d�faut
    Bonjour.

    Tous ces romans pour moi. J'appr�cie.

    Si c'est juste pour m'expliquer qu'on peut aligner un pointeur, donc une fonction (enfin son adresse), donc une classe. Alors relisez le commentaire o� je montre le code avec un alignement d'une classe...

    Citation Envoy� par koala01 Voir le message
    Absolument pas... C'est une utilisation classique, normale et n�cessaire..
    J'attends que vous me montriez plein de code qui utilise l'alignement sur une classe, en expliquant l'int�r�t. Parce que j'ai beau chercher, je n'en trouve pas (en fait, je pense juste que cela ne sert � rien, et que personne ne l'utilise). Les compilateurs font de l'alignement � l'int�rieur des fonctions avec des instructions nop(). Mais je crois que c'est tout.

    Certes il y a la norme C++, et il y a aussi l'utilisation de cette norme. Les d�veloppeurs n'utilisent que l'alignement de structures (jusqu'� ce que vous me prouviez le contraire, bien s�r).
    Citation Envoy� par troll
    Cela devient comme une norme implicite...
    On aligne des structures, et non pas des classes. Et c'est bien une diff�rence d'utilisation entre une classe et une structure en C++. Seule chose que j'ai voulu souligner. Quand je lis vos commentaires, vous �tes born�s sur l'aspect Norme, et vous avez raison sur cet aspect. Mais il n'y a pas que la Norme C++ dans la vie, il y a aussi l'utilisation de cette Norme par les d�veloppeurs.

    PS: j'ai dit qu'on ne pouvait pas aligner des classes, c'�tait une erreur au niveau compilateur en effet, mais que j'ai corrig� lorsque j'ai donn� le code qui compile un alignement de classe. Cela ne change pas le raisonnement qu'on utilise des structures pour l'alignement.

    PS2: on peut faire de l'alignement dynamique (new align...). Mais c'est r�solu � l'ex�cution, pas � la compilation.

    PS3: d�sol� de ne pas avoir r�pondu � chacun d'entre vous, la prochaine fois, je prendrai le temps.

+ R�pondre � la discussion
Cette discussion est r�solue.
Page 1 sur 4 1234 Derni�reDerni�re

Discussions similaires

  1. [D�butant] Classe ou structure
    Par cyrill.gremaud dans le forum C#
    R�ponses: 1
    Dernier message: 14/01/2013, 08h58
  2. [VB.NET] Privil�gier une classe � une structure ou inversement ?
    Par Jean-Philippe Andr� dans le forum D�buter
    R�ponses: 2
    Dernier message: 27/02/2012, 08h47
  3. Organisation d'un programme (Class et Structures)
    Par le_binr dans le forum VB.NET
    R�ponses: 3
    Dernier message: 16/12/2011, 10h12
  4. Classe ou structure ?
    Par tintin72 dans le forum D�buter
    R�ponses: 9
    Dernier message: 20/11/2008, 19h26
  5. R�ponses: 6
    Dernier message: 26/06/2006, 10h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo