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. #21
    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
    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...
    T est un pointeur et un pointeur n'est jamais qu'une variable num�rique enti�re (g�n�ralement) non sign�e dont la taille est au minimum suffisante pour repr�senter l'ensemble des adresses m�moire accessibles sur le syst�me.

    Et cette taille est clairement connue � la compilation!

    On se fout pas mal de savoir que l'adresse m�moire obtenue donne acc�s � 5, 10 ou 10000 �l�ments parce que chacun de ces �l�ment est accessible � une adresse m�moire qui lui est propre et que le processeur est tout � fait en mesure de calculer sur la base de l'adresse du premier �l�ment, de la taille des �l�ments et de l'indice de l'�l�ment auquel on veut acc�der.

    il y a au maximum trois inconnues au moment de la compilation:
    1. L'adresse � laquelle se trouvera le premier �l�ment
    2. le nombre d'�l�ment pour lequel l'allocation dynamique demandera de r�server de la m�moire
    3. l'indice de l'�l�ment auquel on essayera d'acc�der par la suite
    Mais cela ne pose strictement aucun probl�me: on sait que nous obtiendrons de toutes mani�re une valeur num�rique enti�re non sign�e (dont la taille est parfaitement connue) correspondant � l'adresse � laquelle nous trouverons un espace contigu suffisant pour repr�senter l'ensemble des (to) �l�ments pour lesquels on a demand� de r�server de la m�moire.

    Et nous avons la certitude que, le compilateur sachant parfaitement la taille que repr�sente un �l�ment en m�moire, il nous permettra d'acc�der � l'ensemble des adresses m�moires auxquelles se trouve le premier byte de chaque �l�ment.

    Apr�s, il peut y avoir certains probl�me:
    • Le syst�me peut ne pas trouver assez d'espace libre pour r�server l'espace pour le nombre d'�l�ments demand� : new va alors lancer une exception de type std::bad_alloc (ou, si on utilise la version nothrow, renvoyer l'adresse correspondant � NULL / nullptr (c++11) pour indiquer que ce n'est pas une adresse valide)
    • en ayant demand� d'allouer (to) �l�ments, on peut essayer d'acc�der � l'�l�ment (to)+1 dont l'adresse m�moire peut contenir strictement tout et n'importe quoi. Mais �a, c'est un probl�me de logique, et ca n'a rien � voir avec l'alignement des donn�es
    • d'autres probl�mes similaires que j'oublie peut �tre

    sur une classe, en expliquant l'int�r�t. Parce que j'ai beau chercher, je n'en trouve pas.
    L'int�r�t est tout simple : une classe utilise des donn�es pour fournir les services que l'on en attend.

    A ce titre, il faut que le processeur soit en mesure d'acc�der � ces donn�es, au m�me titre qu'il doit pouvoir acc�der aux diff�rents champs d'une structure ou � n'importe quelle variable de n'importe quel type.

    Seulement, si la donn�e en question ne se trouve pas dans un des accumulateur du processeur (et bien qu'il y ai de plus en plus d'accumulateurs, il n'y en a pas un nombre extensible � l'infini), il va devoir aller la chercher "quelque part".

    Ce "quelque part", correspond � la m�moire: soit une m�moire interne au processeur que l'on appelle "la pile", soit la m�moire g�n�rale du syst�me qu'on appelle "le tas".

    Pour pouvoir trouver "la donn�e qui l'int�resse", il a donc besoin de savoir "o� elle se trouve" en m�moire.

    Le seul moyen qu'il ait de savoir o� la donn�es se trouve passe... par l'adresse m�moire de l'�l�ment en question.

    Et cette adresse doit etre accessible au compilateur.

    Or, si les accumulateurs sont en mesure de contenir 32 ou 64 bits de donn�es, les adresses accessibles sont toutes s�par�es par 32 ou 64 bits de donn�es.

    Le processeur ne peut acc�der au "subdivision" de ces 32 (ou 64) bits qu'une fois que ces 32 (ou 64) bits sont charg�s dans un accumulateur (parce que l'accumulateur est, lui-m�me subdivis� en diff�rentes parties de 8, 16 et �ventuellement 32 bits))

    si tu ne pr�cise rien et que tu cr�es une structure proche de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    struct MyStruct{
        char c;
        int i;
    };
    le processeur chercher l'adresse � laquelle commence la structure et qui correspondra � l'adresse de c.

    pour que le processeur puisse acc�der � i, il devra prendre l'adresse (accessible!) qui suit l'adresse de c et, au final, alors qu'un char a une taille de 1 et qu'il aurait donc suffit de 5 bytes pour repr�senter les deux donn�es, tu te retrouves avec un strcuture ayant une taille de 8, "simplement" parce que le compilateur a rajout� la taille de 3 char 'de bourrage" afin de placer i � une distance qui permette au compilateur d'y acc�der.

    Ca, c'est ce qu'on appelle l'alignement.

    Maintenant, que ce soit une structure ou une classe ne changera rien parce que le processeur devra toujours, � un moment ou � un autre, �tre en mesure d'acc�der aussi bien � i qu'� c.

    Il ne faut pas chercher un int�r�t quelconque � cela, il faut y voir une obligation propre au style de fonctionnement du processeur!

    C'est parce que le processeur a un mode de fonctionnement qui lui emp�che d'acc�der "facilement" � des donn�es qui ne sont pas s�par�es par 32 (ou 64) bits que le compilateur s'arrange pour que chaque donn�e de type diff�rent se retrouve � une adresse qui sera accessible par le processeur!

    Mais, pardon, tu demandes quel serait l'int�r�t de modifier la mani�re dont les donn�es d'une classe seraient align�es

    Ce serait exactement le m�me que celui que tu aurais � modifier la mani�re dont les donn�es d'une structure sont align�es : "grignoter" quelque bytes en espace m�moire n�cessaire.

    Je n'y ai personnellement jamais eu recours, mais comme on peut parfaitement utiliser C++ en embarqu� et / ou pour programmer des eeprom et/ou des syst�mes o� le moindre byte de m�moire est important, les occasions de modifier la mani�re dont les donn�es d'une classe sont align�e sont au moins aussi nombreuses que celle de le faire en C sur pour les structures.

    Par contre, l'int�r�t de le faire avec des donn�es priv�es est, bien sur, d'en faciliter l'encapsulation
    Certes il y a la norme C++, et il y a aussi l'utilisation de cette norme.
    Sauf que la norme est la seule chose qui te permette d'obtenir un r�sultat pour lequel tu puisse esp�rer une portabilit� totale.

    Le fait de jouer avec la mani�re dont les donn�es sont align�es te fais prendre de tr�s gros risques � ce niveau
    Les d�veloppeurs n'utilisent que l'alignement de structures (jusqu'� ce que vous me prouviez le contraire, bien s�r). Cela devient comme une norme implicite.
    Nuance: les d�veloppeurs C utilisent que l'alignement de structures. Les pauvres, il n'ont pas d'autre choix

    Les d�veloppeurs C++ peuvent parfaitement (pour des raisons qui leur sont propres, entre autre de m�moire disponible) utiliser l'alignement sur des classes.

    Et, surtout, les d�veloppeur C++ qui ont le choix utiliseront l'alignement "par d�faut" des donn�es

    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.
    Non!!! on peut le faire sur tout, m�me sur une union si tu le souhaites!

    Ce n'est pas parce qu'il n'est pas courent de le faire (qu'il s'agisse d'une classe ou d'une structure, je n'ai personnellement jamais �prouv� le besoin de "jouer" avec l'alignement des donn�es ... et je suis sur que beaucoup de d�veloppeurs C++ qui ne travaillent pas dans l'embarqu� sont dans mon cas ) que cela ne se fait pas.

    C'est "simplement" que le besoin est souvent "moins pr�sent"
    PS: j'ai dit qu'on ne pouvait pas aligner des classes, c'�tatit une erreur 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.
    Mais c'est une erreur de taille!!!

    Parce que tu avais commenc� par dire qu'on ne pouvait pas aligner une classe, ce qui est faux.

    Et, en plus, tu pr�sentais cela comme une diff�rence entre les classes et les structures.

    Mais comme ton assertion (on ne peut pas aligner des classes) �tait fausse, on peut difficilement dire qu'il s'agisse d'une diff�rence entre les deux

    Du coup, on en revient strictement � la norme : la seule diff�rence qui existe entre une classe et une structure en C++, c'est l'accessibilit� par d�faut qui est appliqu�e par le compilateur
    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

  2. #22
    r0d
    r0d est d�connect�
    Membre exp�riment�

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    4 299
    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 299
    Billets dans le blog
    2
    Par d�faut
    Citation Envoy� par koala01 Voir le message
    [...]une m�moire interne au processeur que l'on appelle "la pile"
    Ho. Je croyais que la pile �tait en RAM. Je n'ai rien lu et je n'ai aucune connaissance sur le sujet, mais �a me semble assez intuitif: la m�moire du proc se r�sume � quelques registres, or on peut mettre des Go dans la pile non?

  3. #23
    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 r0d Voir le message
    Ho. Je croyais que la pile �tait en RAM. Je n'ai rien lu et je n'ai aucune connaissance sur le sujet, mais �a me semble assez intuitif: la m�moire du proc se r�sume � quelques registres, or on peut mettre des Go dans la pile non?
    Je pense que Koala pensait plut�t au registre esp qui pointe vers la derni�re assiette de la pile si je puis me permettre la m�taphore
    La pile elle-m�me est bel et bien situ�e dan la ram. (mais je ne suis pas certain que ton OS soit d'accord avec une pile de plusieurs Go )

  4. #24
    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
    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).
    Un alignement applique a une struct est un alignement applique a une class qui ne s'appelle pas comme tel. On a pas besoin de te montrer des exemples (tu peux les trouver sur github d'ailleurs) puisque ca reviens EXACTEMENT AU MEME.


    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).
    Tu realises la difference importante entre ce que le language dis et les conventions arbitraires que s'imposent les gens en entreprises? Tu ne t'es jamais dis que ca pouvait etre different hors de ces entreprises? Sachant qu'ici on parle du langage, les conventions qu'utilisent tel ou tel devs n'ont pas de poids ou de sens ici.

    Note aussi que cette convention est partiellement heritee du C, ou struct n'a pas exactement le meme sens, meme si c'est un sens compatible avec une class dont les membres sont publiques.


    On aligne des structures, et non pas des classes.
    C'est la meme chose. Il n'y a pas a affirmer des choses decidemment fausses.

    Note d'ailleurs qu'en 10 ans de carriere pro je n'ai vu cette convention qu'une fois. Dans tous les autres cas, on fait comme on veut (parceque franchement c'est pas important et ca depends des cas)

    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.
    Tu realises le non sens que tu proposes ici? La norme definis le language, un point c'es tout. Le compilo l'implement aussi bien qu'il peut, et les conventions maisons auquel tu adheres n'ont valeur que dans ta maison. Ellles aident a relire rapidement le meme code de cette maison, mais ca ne veut pas dire que c'est pas different ailleurs (ca l'est, et meme tres tres different).

    C'est aussi absurde que de dire qu'on ne dois jamais utiliser de templates: Certes on peut les utiliser parceque la norme le dis, mais les developeurs ont leur propre norme qui dis de ne pas les utiliser. Eh ben chez toi peut etre mais pas chez moi.

  5. #25
    r0d
    r0d est d�connect�
    Membre exp�riment�

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    4 299
    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 299
    Billets dans le blog
    2
    Par d�faut
    Citation Envoy� par Klaim Voir le message
    Tu realises le non sens que tu proposes ici?
    Bah, il ne faut pas �tre aussi radical. Je ne suis pas choqu� quand, par exemple, sur une des millions de discussions sur struct vs class, je lis quelqu'un qui �crit quelque chose du style: "une pratique courante est d'utiliser struct pour des PODs et les foncteurs". Ce n'est pas une diff�rence technique, mais c'est une pratique, donc pourquoi ne pas en parler?

  6. #26
    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
    Parce que ce n'est pas affirme comme tel par moldavi. Alors peut etre que c'est un probleme de communication mais moldavi semble croire fermement que c'est vrai partout, tandis que j'affirme que c'est effectivement une convention commune mais pas utilisee par tous. Ca ne me choque pas non plus tel que tu le dis rod, mais je trouve dangereux (pour les debutants en particulier) de ne pas preciser la difference entre la norme (CE QUI EST VRAI PARTOUT) et une convention (CE QU'ON PREFERE CHEZ NOUS). Affirmer que la convention est plus importante que la norme est dangereux pour l'education des devs (enfin dans mon experience).

  7. #27
    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
    Citation Envoy� par koala01 Voir le message
    T est un pointeur et un pointeur n'est jamais qu'une variable num�rique enti�re (g�n�ralement) non sign�e dont la taille est au minimum suffisante pour repr�senter l'ensemble des adresses m�moire accessibles sur le syst�me.
    En fait dans son exemple (foireux) T n'est m�me pas un membre de la classe.
    Alors vouloir l'aligner avec a,b,c,d qui sont membres, c'est d'un non sens complet.
    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.

  8. #28
    Membre �prouv�
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par d�faut
    Citation Envoy� par moldavi Voir le message
    J'attends que vous me montriez plein de code qui utilise l'alignement sur une classe, en expliquant l'int�r�t.
    Le m�me que celui sur une structure.
    Avec ce qui peut parfois �tre un avantage : l'acc�s qui est par d�faut priv�.

    Citation Envoy� par moldavi Voir le message
    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).
    Je l'ai encore fait il y a quelques jours pour une d�serialisation...

    Citation Envoy� par moldavi Voir le message
    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++. [...] 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.
    Sache alors que tes pratiques ne sont pas repr�sentatives ne tous les d�veloppeurs.

  9. #29
    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.

    Je vais essayer d''�tre plus pr�cis dans les choses, il est vrai que j'ai l'impression d'�tre dans un dialogue de sourds.

    On utilise l'alignement de donn�es afin de garantir que les donn�es sont contig�es, sans bourrage. On aligne donc des donn�es qu'une fonction assembleur pourra utiliser (c'est un exemple). S'il y a du bourrage, la fonction assembleur ne fonctionnera pas.

    Quand j'ai fait l'erreur de dire qu'on ne peut pas aligner une classe, c'�tait dans le sens o� une classe qui contient des fonctions, on ne peut pas aligner ce qu'il y a � l'int�rieur des fonctions. On peut aligner le pointeur de la fonction, mais pas ses param�tres et pas le code de la fonction.

    http://msdn.microsoft.com/en-us/library/83ythb65.aspx

    You cannot specify alignment for function parameters.
    Donc quand au d�part j'ai dis qu'on ne pouvait pas aligner une classe, c'�tait avec cette id�e l�. D'ailleurs quel serait l'int�r�t par exemple, de passer le code align�e d'une fonction � une fonction assembleur.

    Et pour ceux qui vont me dire que c'est sp�cifique � Visual Studio, et bien faites-nous part de ce qu'il en est sous Linux ou Mac. On apprendra des choses au moins.

    J'ai ensuite corrig� mon erreur en fournissant un code qui compile un alignement de classe. Bien avant toutes vos remarques. Alors comprenez que je prends cela pour de l'archanement .

    Citation Envoy� par Klaim Voir le message
    On a pas besoin de te montrer des exemples (tu peux les trouver sur github d'ailleurs)
    Le probl�me c'est que je n'en trouve pas. Je suis comme Saint-Thomas, je ne crois que ce que je vois.

    Pour l'alignement de structure, tu as d�j� le lien que j'ai fourni, il y a ffmpeg, libavcodec, openframeworks.

    Citation Envoy� par Klaim Voir le message
    La norme definis le language, un point c'es tout. Le compilo l'implement aussi bien qu'il peut, et les conventions maisons auquel tu adheres n'ont valeur que dans ta maison.
    Un point c'est tout...

    Le probl�me c'est que l'alignement de donn�es n'a rien � voir avec la norme du langage. La norme ne d�finit rien sur l'alignement, une personne l'a pr�cis� dans les messages pr�c�dents (on va lui faire confiance).

    Donc d�sol�, je ne vois aucun non-sens dans ce que je dis.

    Citation Envoy� par Klaim Voir le message
    Affirmer que la convention est plus importante que la norme est dangereux pour l'education des devs (enfin dans mon experience).
    Je ne crois pas avoir affirm� une telle chose, si c'est le cas mea culpa. D'ailleurs j'ai surtout employ� le mot souligner il me semble. J'ai juste soulign� une pratique, je ne vois pas en quoi c'est dangereux. De plus, ce dont je parle n'a rien � voir avec la norme...

    Citation Envoy� par oodini Voir le message
    Je l'ai encore fait il y a quelques jours pour une d�serialisation...

    Sache alors que tes pratiques ne sont pas repr�sentatives ne tous les d�veloppeurs.
    Je peux te retourner le m�me argument. Ce n'est pas parce que tu l'a fais, que c'est courant.

    Mais j'attends toujours que vous me montriez du code sur Github, sourceforge et autre.

    Je raisonne juste en statisticien. Je ne vois que des codes sources qui utilisent l'alignement de structure, et je comprends aussi pourquoi, alors je le signale sur ce forum comme diff�rence d'utilisation entre struct et classe.

    Vous m'opposer la norme, mais la norme n'a rien � voir dans l'alignement.

    Quand vous m'aurez fourni suffisamment de lien sur des codes qui utilisent de l'alignement de classe, je r�viserai mon jugement, et je ferai mon mea culpa.

  10. #30
    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
    La norme C++11 propose le mot cl� alignas qui justement traite de l'alignement.

    J'ai l'impression que tu crois qu'un objet contient des pointeurs vers les fonctions membres de sa classe... si c'est le cas laisse moi te dire que ce n'est pas le cas (sauf les fonctions virtuelles, mais c'est particulier et propre � la classe et non � l'objet).

    Aussi le fait d'aligner une classe ne concerne nullement ses fonctions membres (sauf pour les vtables, mais JolyLoic en a parl�), que ce soit leur adresse ou leur impl�mentation.

  11. #31
    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
    Bonjour.

    Je vais essayer d''�tre plus pr�cis dans les choses, il est vrai que j'ai l'impression d'�tre dans un dialogue de sourds.
    Il y a effectivement un probleme entre ce que tu dis et ce que tu montres, d'ou un quiproquo du a une mauvaise interpretation, j'y reviens.

    On utilise l'alignement de donn�es afin de garantir que les donn�es sont contig�es, sans bourrage. On aligne donc des donn�es qu'une fonction assembleur pourra utiliser (c'est un exemple). S'il y a du bourrage, la fonction assembleur ne fonctionnera pas.
    Je ne suis pas sur de comprendre ce que tu veux dire la, essentielement parcequ'on parle ici des types, pas des fonctions, a ce que je sache. J'y reviens.

    Quand j'ai fait l'erreur de dire qu'on ne peut pas aligner une classe, c'�tait dans le sens o� une classe qui contient des fonctions, on ne peut pas aligner ce qu'il y a � l'int�rieur des fonctions. On peut aligner le pointeur de la fonction, mais pas ses param�tres et pas le code de la fonction.

    http://msdn.microsoft.com/en-us/library/83ythb65.aspx

    You cannot specify alignment for function parameters.
    Donc quand au d�part j'ai dis cela, c'�tait avec cette id�e l�. D'ailleurs quel serait l'int�r�t par exemple, de passer le code align�e d'une fonction � une fonction assembleur.
    La ligne que tu viens de citer dis que tu ne peux specifier l'alignement des paramettres de fonctions. Ce qui est evident. Et n'a rien a voir avec ce qu'on dis ici (a priori). Ici on parle du fait qu'on puisse preciser l'alignement de types. Les types ne sont pas des instances de type. Les paramettres de fonctions sont des instances de type. Tu peux utilises tes types en paramettres de fonction qu'ils soient ou pas alignes. Ce que tu ne peux pas faire, c'est preciser l'alignement que tu veux au niveau de la signature de fonction. Sous entendu: si tu precises un alignement pour un type, ca dois etre le meme pour toutes les instances de ce type.

    Autrement dis, tu parles de quelque chose qui ne marche pas (peut etre que tu ne comprends pas bien le modele de memoire en C++?), mais nous on parle d'autre chose qui marche , a savoir que tu peux preciser l'alignement (quel que soit le compilo, ca depends de la syntaxe fournies ou si ils fournissent alignas() ) d'un type, cela incluant enum, union, class et struct et qu'il n'y a pas de difference du point de vue du compilateur, vu que ce n'est "que" de l'agencement en memoire, ce n'est pas lie a la semantique (ca n'a rien a voir avec la difference entre une class, une struct, une enum ou une union).

    Et pour ceux qui vont me dire que c'est sp�cifique � Visual Studio, et bien faites-nous part de ce qu'il en est sous Linux ou Mac. On apprendra des choses au moins.
    Evidemment!
    Si tu nous montre le code que tu as teste, je suis certain qu'il n'est pas conforme, d'ou l'erreur.

    Un point c'est tout...

    Le probl�me c'est que l'alignement de donn�es n'a rien � voir avec la norme du langage. La norme ne d�finit rien sur l'alignement, une personne l'a pr�cis� dans les messages pr�c�dents (on va lui faire confiance).
    Vous m'opposer la norme, mais la norme n'a rien � voir dans l'alignment.

    La norme fournis de quoi faire de l'alignment de maniere cross-platform depuis C++11. Oui c'est nouveau. Gcc4.8 l'implement apparament, je pense que VS2012 aussi mais c'est a verifier.
    Regarde la http://en.cppreference.com/w/cpp/language/alignas
    puis les liens en bas, ya d'autres trucs.

    The alignas specifier may be applied to the declaration of a variable or a class data member, or it can be applied to the definition of a class/struct/union or enum.
    C'est la norme et les compilateurs la suivent, donc si tu penses qu'une pratique ne marche pas sur des compilateurs mais est bien specifiee par la norme, c'est un "bug" du compilateur (ou une feature controversee mais c'est tres rare).


    Le probl�me c'est que je n'en trouve pas.

    Pour l'alignement de structure, tu as d�j� le lien que j'ai fourni, il y a ffmpeg, libavcodec, openframeworks. C'es tr�s facile d'en trouver.
    Quand vous m'aurez fourni suffisamment de lien sur des codes qui utilisent de l'alignement de classe, je r�viserai mon jugement, et je ferai mon mea culpa.
    Effectivement les moteurs de recherche de github et autres hosting de code sont vraiment tout pourris.
    En plus comme je dis dans la suite, alignas() est recent donc tu en trouves tres peux (dans le code de clang aparamment). Du coup tu dois chercher avec les instructions specifiques aux compilateurs.

    Par exemple, si tu cherches avec la syntaxe de gcc pour l'alignement sur 4 bytes, tu vas trouver, parmis un million de bouts de code sur github seulement, ce bout de code qui aligne bien des class et des struct: https://github.com/SRabbelier/Netbea...igned_class.cc

    C'est apparament une partie de NetBeans. C'est pas comme si NetBeans etait pas utilise.

    La recherche que j'ai fait: https://github.com/search?q=class+__...ults&type=Code

    Il n'y a pas ENORMEMENT de code qui aligne des class (par contre yen a pas mal sur les membres de class et les v-table ) mais uniquement par convention. Ca n'a rien a voir avec du code correct et ca n'a rien de bien ou de mal. C'est une habitude, comme souligne precedemment, issue du C.

    Je suis sur que tu peux trouver plus d'exemple en cherchant avec les differentes syntaxes des differents compilateurs.

    Bref, tout ca pour dire que soit:
    - ya un truc que tu sais pas qui te fais penser que C++ marche d'une facon alors que c'est pas le cas, d'ou une sorte de quiproquo;
    - on comprends pas ce que tu veux dire, ou tu dis un truc qui n'a pas de sens (la page que tu pointes est eloquente);

    Donc probleme de comprehension quelque part.

  12. #32
    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'ai l'impression que tu crois qu'un objet contient des pointeurs vers les fonctions membres de sa classe...
    Citation Envoy� par germinolegrand Voir le message


    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);
    Faudra demander � germinolegrand, lui il l'a sp�cifi�.

  13. #33
    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
    Et donc? Parceque la je vois pas du tout ou tu veux en venir.

  14. #34
    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
    Re.

    Citation Envoy� par Klaim Voir le message
    En plus comme je dis dans la suite, alignas() est recent donc tu en trouves tres peux (dans le code de clang aparamment).
    J'ai jet� un oeil sur alignas(). Je dis peut-�tre une b�tise, mais de ce que j'ai lu, ce n'est qu'un mot-cl�. Il n'y � rien de sp�cifi� sur l'alignement. D'ailleurs, pourquoi sp�cifier que "align", �a doit �tre de l'alignement sans bourrage. Les compilateurs n'ont pas attendu la norme C++ pour leur sp�cifier comment on devait aligner des donn�es. C'est juste un mot-cl� que chaque compilateur pourra identifier. Ca �vitera tous les #ifdef...

    Effectivement, premier lien qui y ressemble. Mais je ne vois qu'une d�claration, pas une utilisation.

    Tu me dis que les liens en bas y d'autres trucs. Je dois �tre naze, j'ai rien trouv�...

  15. #35
    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
    Re.



    J'ai jet� un oeil sur alignas(). Je dis peut-�tre une b�tise, mais de ce que j'ai lu, ce n'est qu'un mot-cl�. Il n'y � rien de sp�cifi� sur l'alignement. D'ailleurs, pourquoi sp�cifier que "align", �a doit �tre de l'alignement sans bourrage. Les compilateurs n'ont pas attendu la norme C++ pour leur sp�cifier comment on devait aligner des donn�es. C'est juste un mot-cl� que chaque compilateur pourra identifier.

    O__o;

    Est-ce que tu realises qu'on parle de l'utilisation de ce mot clee (ou de ses equivalent implementes dans chaque compilateur)?
    Tu dis que ca n'a rien a voir avec la norme, mais la norme specifie bien de quoi aligner, donc si ca a tout a voir avec la norme (mais la recente seulement), d'ou le mot clee.

    Faut vraiment que tu montres un exemple de code dont tu parles sinon on va jamais se comprendre.

    Effectivement, premier lien qui y ressemble. Mais je ne vois qu'une d�claration, pas une utilisation.
    (tu as du te tromper de liens je pense, celui ci est celui d'alignas, je suppose que tu parlais ce celui ou je montre du code qui aligne une classe...


    C'est clair, on parle pas du tout de la meme chose. L'alignement se specifie sur la declaration d'un type ou de ses membres, pas autre part, meme avec les instructions specifiques des compilateurs (sauf fantaisies louches de certaines implementations je pense).

  16. #36
    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
    Oui, je viens juste de corriger le lien. Probl�me de copier/coller.

    Je dis juste que cette norme (de ce que j'ai lu), ne d�finit qu'un mot-cl�. Elle ne dit pas au compilateur comment aligner les donn�es.

    D'ailleurs si tous les langages avaient leur propre d�finition de l'alignement des donn�es, ce serait invivable pour les d�veloppeurs d'OS, non ? Et puis l'alignement de donn�es, c'est juste des donn�es contig�es en m�moire, pourquoi le sp�cifier ? Les compilateurs savent tr�s bien le faire.

  17. #37
    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
    Je dis juste que cette norme (de ce que j'ai lu), ne d�finit qu'un mot-cl�. Elle ne dit pas au compilateur comment aligner les donn�es.
    La specification du mot clee defins comment aligner les donnees (peut etre avec des details d'implementations volontairement omis pour que les compilateurs fassent le boulot pour les systemes cible).

    La page que je t'ai fournis explique comment l'utiliser pas comment c'est implemente exactement.


    D'ailleurs si tous les langages avaient leur propre d�finition de l'alignement des donn�es, ce serait invivable pour les d�veloppeurs d'OS, non ? Et puis l'alignement de donn�es, c'est juste des donn�es contig�es en m�moire, pourquoi le sp�cifier ? Les compilateurs savent tr�s bien le faire.
    On dirait que tu ne comprends pas le r�le d'une norme ou d'un standard.

    La norme definis et standardise les pratiques qui sont deja existante (ou des abstractions de ces pratiques), dans une version utilisable par tous, qui sera alors implementee par tous les compilateurs de la meme facon, meme si certaines parties de l'implementation dependent de la plateforme cible (auquel cas la norme dis explicitement que l'implementation, le compilateur, fais ce qui lui chante tant que ce que la norme garanti reste vrai).

    Pourquoi le specifier? Pour que quand tu ecris le code qui aligne, tu n'ais pas a changer ce code pour chaque compilateur que tu utilises. C'est pareil pour toutes les features. C'est aussi le principe d'un language...

    L'essentiel de mon code est compilable sur plusieurs compilateurs qui ne fournissent aps du tout les memes instructions specifiques, parceque je suis le standard et que je n'utilises rien de specifique a un compilateur.

    Autrement dis, la norme c'est la loi. Tout ce qui s'en ecarte est soit illegal, soit non-specifie.

    Pour l'alignement, oui c'etait deja implemente a priori de la meme facon dans tous les compilateurs, mais il n'y avait pas une syntaxe unique pour l'utiliser. Comme c'est implemente partout pareil, il suffit d'une syntaxe en plus, standard, et hop c'est bon. Comme c'est partout pareil, ca implique que class/struct/union/enum sont tous sujet a alignement, comme la norme le specifie, quel que soit le compilateur (et ca l'etait avant la norme).

    D'ou les dernieres pages de discussions, qui disent en gros, que meme si on se fie pas a la norme, l'alignement s'applique a n'importe quel type, ou membre de type.

  18. #38
    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
    Citation Envoy� par moldavi Voir le message
    Quand j'ai fait l'erreur de dire qu'on ne peut pas aligner une classe, c'�tait dans le sens o� une classe qui contient des fonctions, on ne peut pas aligner ce qu'il y a � l'int�rieur des fonctions. On peut aligner le pointeur de la fonction, mais pas ses param�tres et pas le code de la fonction.

    http://msdn.microsoft.com/en-us/library/83ythb65.aspx



    Donc quand au d�part j'ai dis qu'on ne pouvait pas aligner une classe, c'�tait avec cette id�e l�. D'ailleurs quel serait l'int�r�t par exemple, de passer le code align�e d'une fonction � une fonction assembleur.
    Je vais p-e dire des grosses conneries mais...
    - ce qu'il y a � l'int�rieur d'une fonction, on s'en moque, on utilise des types, ce sont les types qui sont align�s ou non. Le code g�n�r� pour/par la fonction n'est pas notre souci.
    - Les param�tres d'appel � une fonction sont g�r�s par la callstack (ou truc du genre), encore une fois on s'en moque, ce n'est pas un type � aligner, c'est juste qqs registres qui sont param�tr�s, rien � voir avec l'alignement de donn�es
    - je ne vois absolument pas ce qu'est sens� montr� ton lien vers msdn. Rien de plus que de l'alignement de donn�es avec un mot-cl�. On a aussi un #pragma pack (de m�moire) utilisable pour l'alignement
    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.

  19. #39
    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 Klaim Voir le message
    On dirait que tu ne comprends pas le r�le d'une norme ou d'un standard.
    Oui �a c'est possible, mais relis bien un de mes messages. J'ai dit que �a �vitera les #ifdef.

    Tu penses toujours que je ne comprends rien aux normes, enfin surtout aux cons�quences pratiques.

  20. #40
    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 Bousk Voir le message
    - ce qu'il y a � l'int�rieur d'une fonction, on s'en moque, on utilise des types, ce sont les types qui sont align�s ou non. Le code g�n�r� pour/par la fonction n'est pas notre souci.
    Et oui, comme tu le dis si bien, on aligne des types, et que pour les fonctions ce n'est pas notre souci (je reprends tes mots).

    Et comme on aligne des types, on va naturellement utiliser des structures et non pas des classes.

    Mais visiblement je suis le seul � faire cette constatation.

+ R�pondre � la discussion
Cette discussion est r�solue.
Page 2 sur 4 Premi�rePremi�re 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