Citation:
Envoyé par
moldavi
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.
Citation:
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.
Citation:
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
Citation:
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).
Citation:
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.
Citation:
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).
Citation:
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.
Citation:
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).
Citation:
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.
Citation:
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. :aie: