On 25 nov, 12:03, candide wrote:[Si quelqu'un a un exemple du même genre sur x86, qu'il le donne.]
Il a pourtatnt été bien expliqué que ça ne se produisait pas sur x86,
mais ça ça ralentissait le bazar...Est-il certain qu'il s'agisse bien d'un problème d'alignement ?
Oui.En quoi
ai-je bien le droit d'affecter 0 à l'adresse pi ,
Ce n'est pas ce que je fais. J'écris 0 à l'adresse pointée par pi. Tu
ne sais plus lire le C ?
Bah, codage de goret (3 cast, quand même pour y arriver)->
comportement indéfini. Ça te suffit ?
Ça te suffit ?
On 25 nov, 12:03, candide <cand...@free.invalid> wrote:
[Si quelqu'un a un exemple du même genre sur x86, qu'il le donne.]
Il a pourtatnt été bien expliqué que ça ne se produisait pas sur x86,
mais ça ça ralentissait le bazar...
Est-il certain qu'il s'agisse bien d'un problème d'alignement ?
Oui.
En quoi
ai-je bien le droit d'affecter 0 à l'adresse pi ,
Ce n'est pas ce que je fais. J'écris 0 à l'adresse pointée par pi. Tu
ne sais plus lire le C ?
Bah, codage de goret (3 cast, quand même pour y arriver)->
comportement indéfini. Ça te suffit ?
Ça te suffit ?
On 25 nov, 12:03, candide wrote:[Si quelqu'un a un exemple du même genre sur x86, qu'il le donne.]
Il a pourtatnt été bien expliqué que ça ne se produisait pas sur x86,
mais ça ça ralentissait le bazar...Est-il certain qu'il s'agisse bien d'un problème d'alignement ?
Oui.En quoi
ai-je bien le droit d'affecter 0 à l'adresse pi ,
Ce n'est pas ce que je fais. J'écris 0 à l'adresse pointée par pi. Tu
ne sais plus lire le C ?
Bah, codage de goret (3 cast, quand même pour y arriver)->
comportement indéfini. Ça te suffit ?
Ça te suffit ?
Un langage de programmation est un objet relativement simple
mais quand même assez complexe (comparer à une langue le exemple).
Un langage de programmation est un objet relativement simple
mais quand même assez complexe (comparer à une langue le exemple).
Un langage de programmation est un objet relativement simple
mais quand même assez complexe (comparer à une langue le exemple).
Antoine Leca a écrit :En news:492bdb97$0$6693$, candide va escriure:-ed- a écrit :
J'ai essayé sur mon PC et rien, hélas.
Donc, au départ, ce n'est pas même pas du code portable, c'est bien
cela que tu nous dis ?
S'il en est ainsi, je dis "vive la portabilité !" et
"vive la norme", ça évite de se poser des questions, ce qui augmente
notre espérance de vie.
En quoi ai-je bien le droit d'affecter 0 à l'adresse pi
???
Tu assignes 0 à l'*objet* référencé par le pointeur pi, qui est aussi
l'objet référencé par le pointeur x,
C'est le même objet ?
je comprends plus rien.
L'objet référencé par pi c'est bien une suite de 4 long
et l'objet référencé par pi c'est un int,
non ? donc c'est pas pareil.
qui a la même adresse que le multiplet (/byte/) qui suit
qui suit ? à cause du +1 dans
char *p = (char *) x + 1;
c'est bien ça ?
L'entier *pi est bien à cheval entre deux case du tableau x, c'est ça ?
OK, mais moi, en tant que personne bien éduqué, je pensais que je
mettais un entier dans une case prévu à cet effet et pas n'importe où.
S'il n'y a pas de problème d'accès arbitraire à la mémoire,
Je vois pas à quoi tu fais allusion.
et ce malgré le cast en int * lors e l'initialisation?
Le transtypage en int* n'est là que pour faire taire le compilateur.
OK mais surtout ça permet de faire n'importe quoi.
Le problème finalement c'est que je sais plus si je fais des choses
autorisées ou pas.
Et si c'est un problème d'alignement, quel § de la norme n'est pas
respecté ?
6.2.3.2p7, deuxième phrase.
Pas trouvé cette référence dans mon exemplaire pdf
La seule chose que j'aie trouvée est ce que j'ai cité dans ma réponse
à Pierre Maurette.
Antoine Leca a écrit :
En news:492bdb97$0$6693$426a74cc@news.free.fr, candide va escriure:
-ed- a écrit :
J'ai essayé sur mon PC et rien, hélas.
Donc, au départ, ce n'est pas même pas du code portable, c'est bien
cela que tu nous dis ?
S'il en est ainsi, je dis "vive la portabilité !" et
"vive la norme", ça évite de se poser des questions, ce qui augmente
notre espérance de vie.
En quoi ai-je bien le droit d'affecter 0 à l'adresse pi
???
Tu assignes 0 à l'*objet* référencé par le pointeur pi, qui est aussi
l'objet référencé par le pointeur x,
C'est le même objet ?
je comprends plus rien.
L'objet référencé par pi c'est bien une suite de 4 long
et l'objet référencé par pi c'est un int,
non ? donc c'est pas pareil.
qui a la même adresse que le multiplet (/byte/) qui suit
qui suit ? à cause du +1 dans
char *p = (char *) x + 1;
c'est bien ça ?
L'entier *pi est bien à cheval entre deux case du tableau x, c'est ça ?
OK, mais moi, en tant que personne bien éduqué, je pensais que je
mettais un entier dans une case prévu à cet effet et pas n'importe où.
S'il n'y a pas de problème d'accès arbitraire à la mémoire,
Je vois pas à quoi tu fais allusion.
et ce malgré le cast en int * lors e l'initialisation?
Le transtypage en int* n'est là que pour faire taire le compilateur.
OK mais surtout ça permet de faire n'importe quoi.
Le problème finalement c'est que je sais plus si je fais des choses
autorisées ou pas.
Et si c'est un problème d'alignement, quel § de la norme n'est pas
respecté ?
6.2.3.2p7, deuxième phrase.
Pas trouvé cette référence dans mon exemplaire pdf
La seule chose que j'aie trouvée est ce que j'ai cité dans ma réponse
à Pierre Maurette.
Antoine Leca a écrit :En news:492bdb97$0$6693$, candide va escriure:-ed- a écrit :
J'ai essayé sur mon PC et rien, hélas.
Donc, au départ, ce n'est pas même pas du code portable, c'est bien
cela que tu nous dis ?
S'il en est ainsi, je dis "vive la portabilité !" et
"vive la norme", ça évite de se poser des questions, ce qui augmente
notre espérance de vie.
En quoi ai-je bien le droit d'affecter 0 à l'adresse pi
???
Tu assignes 0 à l'*objet* référencé par le pointeur pi, qui est aussi
l'objet référencé par le pointeur x,
C'est le même objet ?
je comprends plus rien.
L'objet référencé par pi c'est bien une suite de 4 long
et l'objet référencé par pi c'est un int,
non ? donc c'est pas pareil.
qui a la même adresse que le multiplet (/byte/) qui suit
qui suit ? à cause du +1 dans
char *p = (char *) x + 1;
c'est bien ça ?
L'entier *pi est bien à cheval entre deux case du tableau x, c'est ça ?
OK, mais moi, en tant que personne bien éduqué, je pensais que je
mettais un entier dans une case prévu à cet effet et pas n'importe où.
S'il n'y a pas de problème d'accès arbitraire à la mémoire,
Je vois pas à quoi tu fais allusion.
et ce malgré le cast en int * lors e l'initialisation?
Le transtypage en int* n'est là que pour faire taire le compilateur.
OK mais surtout ça permet de faire n'importe quoi.
Le problème finalement c'est que je sais plus si je fais des choses
autorisées ou pas.
Et si c'est un problème d'alignement, quel § de la norme n'est pas
respecté ?
6.2.3.2p7, deuxième phrase.
Pas trouvé cette référence dans mon exemplaire pdf
La seule chose que j'aie trouvée est ce que j'ai cité dans ma réponse
à Pierre Maurette.
- Visual C++ Express, XP x86-64 mais en 32 bits. Rien à faire, j'ai
bien un accès désaligné vérifié au niveau du code machine, le bit 18
de eflags et le bit 18 de cr0 sont bien allumés, mais pas plus
d'exception que de beurre en branche. Je ferai un coup de Windbg à
l'occasion...
- Visual C++ Express, XP x86-64 mais en 32 bits. Rien à faire, j'ai
bien un accès désaligné vérifié au niveau du code machine, le bit 18
de eflags et le bit 18 de cr0 sont bien allumés, mais pas plus
d'exception que de beurre en branche. Je ferai un coup de Windbg à
l'occasion...
- Visual C++ Express, XP x86-64 mais en 32 bits. Rien à faire, j'ai
bien un accès désaligné vérifié au niveau du code machine, le bit 18
de eflags et le bit 18 de cr0 sont bien allumés, mais pas plus
d'exception que de beurre en branche. Je ferai un coup de Windbg à
l'occasion...
En news:492c9d7e$0$23500$, candide va escriure:Un langage de programmation est un objet relativement simple
mais quand même assez complexe (comparer à une langue le exemple).
n'a rien à voir : on n'apprend pas une langue comme un langage de
programmation.
En news:492c9d7e$0$23500$426a74cc@news.free.fr, candide va escriure:
Un langage de programmation est un objet relativement simple
mais quand même assez complexe (comparer à une langue le exemple).
n'a rien à voir : on n'apprend pas une langue comme un langage de
programmation.
En news:492c9d7e$0$23500$, candide va escriure:Un langage de programmation est un objet relativement simple
mais quand même assez complexe (comparer à une langue le exemple).
n'a rien à voir : on n'apprend pas une langue comme un langage de
programmation.
D'abord, comme tous les codes C ou presque, ce code est portable dans
certaines limites, ici sous réserve d'utiliser seulement des machines
n'ayant pas de contraintes d'alignement.
Donc tu viens d'apprendre qu'en C, il est possible, et même relativement
facile, de mettre ses entiers « n'importe où ».
Hmmm, pas sûr que tu aies bien cherché...
C'est la formulation C90, qui est ici sensiblement moins claire que celle de
C99. Mais le résultat net est très similaire.
D'abord, comme tous les codes C ou presque, ce code est portable dans
certaines limites, ici sous réserve d'utiliser seulement des machines
n'ayant pas de contraintes d'alignement.
Donc tu viens d'apprendre qu'en C, il est possible, et même relativement
facile, de mettre ses entiers « n'importe où ».
Hmmm, pas sûr que tu aies bien cherché...
C'est la formulation C90, qui est ici sensiblement moins claire que celle de
C99. Mais le résultat net est très similaire.
D'abord, comme tous les codes C ou presque, ce code est portable dans
certaines limites, ici sous réserve d'utiliser seulement des machines
n'ayant pas de contraintes d'alignement.
Donc tu viens d'apprendre qu'en C, il est possible, et même relativement
facile, de mettre ses entiers « n'importe où ».
Hmmm, pas sûr que tu aies bien cherché...
C'est la formulation C90, qui est ici sensiblement moins claire que celle de
C99. Mais le résultat net est très similaire.
Antoine Leca a écrit :
D'abord, comme tous les codes C ou presque, ce code est portable dans
certaines limites, ici sous réserve d'utiliser seulement des machines
n'ayant pas de contraintes d'alignement.
OK mais le problème c'est que je suis pas censé connaitre les
contraintes d'alignement de telle ou telle cible. Donc que dois-je faire
pour être sûr de ne pas produire de code violant une contrainte
d'alignement ?
puisque par exemple les objets créés par malloc sont correctement
alignés, la norme l'assure :
Antoine Leca a écrit :
D'abord, comme tous les codes C ou presque, ce code est portable dans
certaines limites, ici sous réserve d'utiliser seulement des machines
n'ayant pas de contraintes d'alignement.
OK mais le problème c'est que je suis pas censé connaitre les
contraintes d'alignement de telle ou telle cible. Donc que dois-je faire
pour être sûr de ne pas produire de code violant une contrainte
d'alignement ?
puisque par exemple les objets créés par malloc sont correctement
alignés, la norme l'assure :
Antoine Leca a écrit :
D'abord, comme tous les codes C ou presque, ce code est portable dans
certaines limites, ici sous réserve d'utiliser seulement des machines
n'ayant pas de contraintes d'alignement.
OK mais le problème c'est que je suis pas censé connaitre les
contraintes d'alignement de telle ou telle cible. Donc que dois-je faire
pour être sûr de ne pas produire de code violant une contrainte
d'alignement ?
puisque par exemple les objets créés par malloc sont correctement
alignés, la norme l'assure :
Antoine Leca a écrit :
D'abord, comme tous les codes C ou presque, ce code est portable dans
certaines limites, ici sous réserve d'utiliser seulement des machines
n'ayant pas de contraintes d'alignement.
OK mais le problème c'est que je suis pas censé connaitre les
contraintes d'alignement de telle ou telle cible. Donc que dois-je
faire pour être sûr de ne pas produire de code violant une
contrainte d'alignement ?
Le compilateur est pourtant capable de gérer l'alignement puisque
par exemple les objets créés par malloc sont correctement alignés,
la norme l'assure :
Si je déclare
double toto=3.14;
toto est bien aligné je suppose.
Donc, comment puis-je savoir si ma conversion ne va pas engendrer une
erreur d'alignement, après tout les conversions d'un pointeur de type
T1 en un pointeur de type T2 distinct de T1 ne sont pas rares ?
Donc tu viens d'apprendre qu'en C, il est possible, et même
relativement facile, de mettre ses entiers « n'importe où ».
OK mais dans la pratique, les cas où a besoin de faire ce genre
d'écritures sauvages sont assez rares je suppose.
Antoine Leca a écrit :
D'abord, comme tous les codes C ou presque, ce code est portable dans
certaines limites, ici sous réserve d'utiliser seulement des machines
n'ayant pas de contraintes d'alignement.
OK mais le problème c'est que je suis pas censé connaitre les
contraintes d'alignement de telle ou telle cible. Donc que dois-je
faire pour être sûr de ne pas produire de code violant une
contrainte d'alignement ?
Le compilateur est pourtant capable de gérer l'alignement puisque
par exemple les objets créés par malloc sont correctement alignés,
la norme l'assure :
Si je déclare
double toto=3.14;
toto est bien aligné je suppose.
Donc, comment puis-je savoir si ma conversion ne va pas engendrer une
erreur d'alignement, après tout les conversions d'un pointeur de type
T1 en un pointeur de type T2 distinct de T1 ne sont pas rares ?
Donc tu viens d'apprendre qu'en C, il est possible, et même
relativement facile, de mettre ses entiers « n'importe où ».
OK mais dans la pratique, les cas où a besoin de faire ce genre
d'écritures sauvages sont assez rares je suppose.
Antoine Leca a écrit :
D'abord, comme tous les codes C ou presque, ce code est portable dans
certaines limites, ici sous réserve d'utiliser seulement des machines
n'ayant pas de contraintes d'alignement.
OK mais le problème c'est que je suis pas censé connaitre les
contraintes d'alignement de telle ou telle cible. Donc que dois-je
faire pour être sûr de ne pas produire de code violant une
contrainte d'alignement ?
Le compilateur est pourtant capable de gérer l'alignement puisque
par exemple les objets créés par malloc sont correctement alignés,
la norme l'assure :
Si je déclare
double toto=3.14;
toto est bien aligné je suppose.
Donc, comment puis-je savoir si ma conversion ne va pas engendrer une
erreur d'alignement, après tout les conversions d'un pointeur de type
T1 en un pointeur de type T2 distinct de T1 ne sont pas rares ?
Donc tu viens d'apprendre qu'en C, il est possible, et même
relativement facile, de mettre ses entiers « n'importe où ».
OK mais dans la pratique, les cas où a besoin de faire ce genre
d'écritures sauvages sont assez rares je suppose.
Écrire du code strictement conforme, ou ce qui revient au même le plus
portable possible. Donc, si tu suis la norme, éviter les conditions de
comportement indéfini, ainsi que les comportements non spécifiés ou définis
par l'implémentation ayant un impact sur les productions du programme
(clause 4 alinéa 5).
Dans le cas des alignements, cela revient à ne pas faire de transtypages (ou
de conversions en général) de pointeurs, sauf dans les cas expressément
garantis par la norme, donc de T* à char* ou void*, et éventuellement retour
ultérieurement à T* _pour la même adresse que l'origine_. Autre cas
expressément permis, transtyper le résultat de malloc() à T* arbitraire.
Le compilateur est pourtant capable de gérer l'alignement puisque
par exemple les objets créés par malloc sont correctement alignés,
la norme l'assure :
Ce n'est pas le compilateur qui assure cela, c'est l'implémentation de la
bibliothèque standard.
Donc, comment puis-je savoir si ma conversion ne va pas engendrer une
erreur d'alignement, après tout les conversions d'un pointeur de type
T1 en un pointeur de type T2 distinct de T1 ne sont pas rares ?
Dans du code portable, elles devraient l'être, rares : pour quelles raisons
va-t-on faire ce genre d'acrobaties ?
Écrire du code strictement conforme, ou ce qui revient au même le plus
portable possible. Donc, si tu suis la norme, éviter les conditions de
comportement indéfini, ainsi que les comportements non spécifiés ou définis
par l'implémentation ayant un impact sur les productions du programme
(clause 4 alinéa 5).
Dans le cas des alignements, cela revient à ne pas faire de transtypages (ou
de conversions en général) de pointeurs, sauf dans les cas expressément
garantis par la norme, donc de T* à char* ou void*, et éventuellement retour
ultérieurement à T* _pour la même adresse que l'origine_. Autre cas
expressément permis, transtyper le résultat de malloc() à T* arbitraire.
Le compilateur est pourtant capable de gérer l'alignement puisque
par exemple les objets créés par malloc sont correctement alignés,
la norme l'assure :
Ce n'est pas le compilateur qui assure cela, c'est l'implémentation de la
bibliothèque standard.
Donc, comment puis-je savoir si ma conversion ne va pas engendrer une
erreur d'alignement, après tout les conversions d'un pointeur de type
T1 en un pointeur de type T2 distinct de T1 ne sont pas rares ?
Dans du code portable, elles devraient l'être, rares : pour quelles raisons
va-t-on faire ce genre d'acrobaties ?
Écrire du code strictement conforme, ou ce qui revient au même le plus
portable possible. Donc, si tu suis la norme, éviter les conditions de
comportement indéfini, ainsi que les comportements non spécifiés ou définis
par l'implémentation ayant un impact sur les productions du programme
(clause 4 alinéa 5).
Dans le cas des alignements, cela revient à ne pas faire de transtypages (ou
de conversions en général) de pointeurs, sauf dans les cas expressément
garantis par la norme, donc de T* à char* ou void*, et éventuellement retour
ultérieurement à T* _pour la même adresse que l'origine_. Autre cas
expressément permis, transtyper le résultat de malloc() à T* arbitraire.
Le compilateur est pourtant capable de gérer l'alignement puisque
par exemple les objets créés par malloc sont correctement alignés,
la norme l'assure :
Ce n'est pas le compilateur qui assure cela, c'est l'implémentation de la
bibliothèque standard.
Donc, comment puis-je savoir si ma conversion ne va pas engendrer une
erreur d'alignement, après tout les conversions d'un pointeur de type
T1 en un pointeur de type T2 distinct de T1 ne sont pas rares ?
Dans du code portable, elles devraient l'être, rares : pour quelles raisons
va-t-on faire ce genre d'acrobaties ?
Pourtant, j'ai l'impression que dans la pratique on se donne beaucoup
plus de liberté pour faire des conversions de pointeurs, enfin, je vais
surveiller ça avec attention dans le code qui me passera sous les yeux.
Pourtant, j'ai l'impression que dans la pratique on se donne beaucoup
plus de liberté pour faire des conversions de pointeurs, enfin, je vais
surveiller ça avec attention dans le code qui me passera sous les yeux.
Pourtant, j'ai l'impression que dans la pratique on se donne beaucoup
plus de liberté pour faire des conversions de pointeurs, enfin, je vais
surveiller ça avec attention dans le code qui me passera sous les yeux.