Une petite question me tarraude!
Est-ce que l'union est portable d'une architecture à une autre?
Typiquement, est-ce que le programme tournera sur un sparc comme sur un ix86
(sous le même OS)?
En effet, est-ce que sur certaines machines les poids forts/faibles ne
sont-ils pas inversés?
ex:
typedef union _u_int
{
int int_val;
char char_val[4];
}u_int;
Accède-t-on au premier octet de int_val par char_val[0], char_val[3]
ou ça dépend?
- A part le gain en mémoire (pas néglgeable), j'ai un peu l'impression que les utilisations les plus intéressantes de l'union sont non portables ;-).
L'utilisation portable de l'union, c'est... le pendant des enregistrement variants du Pascal (et de plusieurs autres langages): une première partie commune à tous les sous-types, qui contient les discriminants; puis des sous-parties (se recouvrant) pour chacun des différents sous-types.
Le truc sympa, c'est qu'avec un pointeur vers l'union, disons passé en argument, on peut (légalement, enfin portablement) examiner les
Ta restriction m'etonne. J'avais le souvenir d'avoir verifie la conformite de la chose; je doute que ce soit pour du C++. J'ai pas le temps d'aller revoir ca maintenant.
A+
-- Jean-Marc FAQ de fclc: http://www.isty-info.uvsq.fr/~rumeau/fclc Site de usenet-fr: http://www.usenet-fr.news.eu.org
"Antoine Leca" <root@localhost.invalid> writes:
Pierre Maurette wrote:
- A part le gain en mémoire (pas néglgeable), j'ai un peu l'impression
que les utilisations les plus intéressantes de l'union sont non
portables ;-).
L'utilisation portable de l'union, c'est... le pendant des
enregistrement variants du Pascal (et de plusieurs autres langages):
une première partie commune à tous les sous-types, qui contient les
discriminants; puis des sous-parties (se recouvrant) pour chacun des
différents sous-types.
Le truc sympa, c'est qu'avec un pointeur vers l'union, disons passé
en argument, on peut (légalement, enfin portablement) examiner les
Ta restriction m'etonne. J'avais le souvenir d'avoir verifie la
conformite de la chose; je doute que ce soit pour du C++. J'ai pas le
temps d'aller revoir ca maintenant.
A+
--
Jean-Marc
FAQ de fclc: http://www.isty-info.uvsq.fr/~rumeau/fclc
Site de usenet-fr: http://www.usenet-fr.news.eu.org
- A part le gain en mémoire (pas néglgeable), j'ai un peu l'impression que les utilisations les plus intéressantes de l'union sont non portables ;-).
L'utilisation portable de l'union, c'est... le pendant des enregistrement variants du Pascal (et de plusieurs autres langages): une première partie commune à tous les sous-types, qui contient les discriminants; puis des sous-parties (se recouvrant) pour chacun des différents sous-types.
Le truc sympa, c'est qu'avec un pointeur vers l'union, disons passé en argument, on peut (légalement, enfin portablement) examiner les
Ta restriction m'etonne. J'avais le souvenir d'avoir verifie la conformite de la chose; je doute que ce soit pour du C++. J'ai pas le temps d'aller revoir ca maintenant.
A+
-- Jean-Marc FAQ de fclc: http://www.isty-info.uvsq.fr/~rumeau/fclc Site de usenet-fr: http://www.usenet-fr.news.eu.org
Pierre Maurette
Pierre Maurette wrote:
- A part le gain en mémoire (pas néglgeable), j'ai un peu l'impression que les utilisations les plus intéressantes de l'union sont non portables ;-).
L'utilisation portable de l'union, c'est... le pendant des enregistrement variants du Pascal (et de plusieurs autres langages): une première partie commune à tous les sous-types, qui contient les discriminants; puis des sous-parties (se recouvrant) pour chacun des différents sous-types.
Le truc sympa, c'est qu'avec un pointeur vers l'union, disons passé en argument, on peut (légalement, enfin portablement) examiner les discriminants, puis transtyper correctement et accéder aux éléments de la sous-partie qui correspond à ce qui a été rangé réellement dans l'union passée comme paramètre. Le degré de base du polymorphisme, mais c'est amplement suffisant pour plein plein de choses. Oui, j'ai effectivement vu que la norme prévoit, dans le cas d'une
union de structures, la persistence des données initiales de même type ou de type équivalent. Tu éclaires ma lanterne sur le "sous-jacent" de la chose. Je m'en doutais un peu.
- Je suis à peu près convaincu que, si vous vous limitez à un nombre fini de plateformes (x86, x86-64, Sparc par exemple), l'union comme vous voulez l'utiliser ne vous emmerdera pas,
ÀMHA, là tu t'avances... Le Sparc est gros-boutien, je crois... Oui.
D'ailleurs, tu écris ensuite...
- Dans tous les cas, l'endianité devra être prise en compte.
... et cela suffit en général à faire que les utilisations un peu trop tangentes des unions deviennent caduques. En fait, sachant que x86 et Sparc étaient d'endianités différentes, le
code proposé (ou l'utilisation abusive de l'union) était d'abord un code de diagnostic de l'endianité. Il aurait d'ailleurs peut-être fallu affiner, il n'y a pas que 2 façons d'écrire des 32 bits dans une mémoire dont "l'atome" est de 8 bits.
Une question, souhaitez-vous accèder à votre int par char ou par octet ?
Taquin, va... Nunca jamas ....
-- Pierre
-- Ceci est une signature automatique de MesNews. Site : http://www.mesnews.net
Pierre Maurette wrote:
- A part le gain en mémoire (pas néglgeable), j'ai un peu l'impression
que les utilisations les plus intéressantes de l'union sont non
portables ;-).
L'utilisation portable de l'union, c'est... le pendant des enregistrement
variants du Pascal (et de plusieurs autres langages): une première partie
commune à tous les sous-types, qui contient les discriminants; puis des
sous-parties (se recouvrant) pour chacun des différents sous-types.
Le truc sympa, c'est qu'avec un pointeur vers l'union, disons passé en
argument, on peut (légalement, enfin portablement) examiner les
discriminants, puis transtyper correctement et accéder aux éléments de la
sous-partie qui correspond à ce qui a été rangé réellement dans l'union
passée comme paramètre. Le degré de base du polymorphisme, mais c'est
amplement suffisant pour plein plein de choses.
Oui, j'ai effectivement vu que la norme prévoit, dans le cas d'une
union de structures, la persistence des données initiales de même type
ou de type équivalent. Tu éclaires ma lanterne sur le "sous-jacent" de
la chose. Je m'en doutais un peu.
- Je suis à peu près convaincu que, si vous vous limitez à un nombre
fini de plateformes (x86, x86-64, Sparc par exemple), l'union comme
vous voulez l'utiliser ne vous emmerdera pas,
ÀMHA, là tu t'avances... Le Sparc est gros-boutien, je crois...
Oui.
D'ailleurs, tu écris ensuite...
- Dans tous les cas, l'endianité devra être prise en compte.
... et cela suffit en général à faire que les utilisations un peu trop
tangentes des unions deviennent caduques.
En fait, sachant que x86 et Sparc étaient d'endianités différentes, le
code proposé (ou l'utilisation abusive de l'union) était d'abord un
code de diagnostic de l'endianité. Il aurait d'ailleurs peut-être fallu
affiner, il n'y a pas que 2 façons d'écrire des 32 bits dans une
mémoire dont "l'atome" est de 8 bits.
Une question, souhaitez-vous accèder à votre int par char ou par
octet ?
Taquin, va...
Nunca jamas ....
--
Pierre
--
Ceci est une signature automatique de MesNews.
Site : http://www.mesnews.net
- A part le gain en mémoire (pas néglgeable), j'ai un peu l'impression que les utilisations les plus intéressantes de l'union sont non portables ;-).
L'utilisation portable de l'union, c'est... le pendant des enregistrement variants du Pascal (et de plusieurs autres langages): une première partie commune à tous les sous-types, qui contient les discriminants; puis des sous-parties (se recouvrant) pour chacun des différents sous-types.
Le truc sympa, c'est qu'avec un pointeur vers l'union, disons passé en argument, on peut (légalement, enfin portablement) examiner les discriminants, puis transtyper correctement et accéder aux éléments de la sous-partie qui correspond à ce qui a été rangé réellement dans l'union passée comme paramètre. Le degré de base du polymorphisme, mais c'est amplement suffisant pour plein plein de choses. Oui, j'ai effectivement vu que la norme prévoit, dans le cas d'une
union de structures, la persistence des données initiales de même type ou de type équivalent. Tu éclaires ma lanterne sur le "sous-jacent" de la chose. Je m'en doutais un peu.
- Je suis à peu près convaincu que, si vous vous limitez à un nombre fini de plateformes (x86, x86-64, Sparc par exemple), l'union comme vous voulez l'utiliser ne vous emmerdera pas,
ÀMHA, là tu t'avances... Le Sparc est gros-boutien, je crois... Oui.
D'ailleurs, tu écris ensuite...
- Dans tous les cas, l'endianité devra être prise en compte.
... et cela suffit en général à faire que les utilisations un peu trop tangentes des unions deviennent caduques. En fait, sachant que x86 et Sparc étaient d'endianités différentes, le
code proposé (ou l'utilisation abusive de l'union) était d'abord un code de diagnostic de l'endianité. Il aurait d'ailleurs peut-être fallu affiner, il n'y a pas que 2 façons d'écrire des 32 bits dans une mémoire dont "l'atome" est de 8 bits.
Une question, souhaitez-vous accèder à votre int par char ou par octet ?
Taquin, va... Nunca jamas ....
-- Pierre
-- Ceci est une signature automatique de MesNews. Site : http://www.mesnews.net
Antoine Leca
Jean-Marc Bourguet wrote:
"Antoine Leca" writes:
Le truc sympa, c'est qu'avec un pointeur vers l'union, disons passé en argument, on peut (légalement, enfin portablement) examiner les
Ta restriction m'etonne.
Tu as raison d'être étonné!
J'ai écrit légalement parce que c'est le cas, puis, dans un effort pour éviter de rendre ce fil inaccessible aux nouveaux venus et d'éviter de circonscrire le débat à des querelles d'experts sur le sexe de la norme (cf. des discussions récentes), j'avais ajouté le mot portable pour essayer de me rendre plus abordable ou plus intéressant. En d'aures termes, le « enfin » ci-dessus n'est pas exclusif, c'est une simple conjonction. Cette utilisation est portable (ce qui importe), et elle est « légale » (quelque soit le sens que l'on donne à ce mot).
Rassuré ? ;-)
Antoine
Jean-Marc Bourguet wrote:
"Antoine Leca" <root@localhost.invalid> writes:
Le truc sympa, c'est qu'avec un pointeur vers l'union, disons passé
en argument, on peut (légalement, enfin portablement) examiner les
Ta restriction m'etonne.
Tu as raison d'être étonné!
J'ai écrit légalement parce que c'est le cas, puis, dans un effort pour
éviter de rendre ce fil inaccessible aux nouveaux venus et d'éviter de
circonscrire le débat à des querelles d'experts sur le sexe de la norme (cf.
des discussions récentes), j'avais ajouté le mot portable pour essayer de me
rendre plus abordable ou plus intéressant.
En d'aures termes, le « enfin » ci-dessus n'est pas exclusif, c'est une
simple conjonction. Cette utilisation est portable (ce qui importe), et elle
est « légale » (quelque soit le sens que l'on donne à ce mot).
Le truc sympa, c'est qu'avec un pointeur vers l'union, disons passé en argument, on peut (légalement, enfin portablement) examiner les
Ta restriction m'etonne.
Tu as raison d'être étonné!
J'ai écrit légalement parce que c'est le cas, puis, dans un effort pour éviter de rendre ce fil inaccessible aux nouveaux venus et d'éviter de circonscrire le débat à des querelles d'experts sur le sexe de la norme (cf. des discussions récentes), j'avais ajouté le mot portable pour essayer de me rendre plus abordable ou plus intéressant. En d'aures termes, le « enfin » ci-dessus n'est pas exclusif, c'est une simple conjonction. Cette utilisation est portable (ce qui importe), et elle est « légale » (quelque soit le sens que l'on donne à ce mot).
Rassuré ? ;-)
Antoine
Antoine Leca
Pierre Maurette wrote:
Il aurait d'ailleurs peut-être fallu affiner, il n'y a pas que 2 façons d'écrire des 32 bits dans une mémoire dont "l'atome" est de 8 bits.
Certes, mais les autres manières sont ou des dinosaures, ou des mirages.
Tout le monde (ou presque ;-)) se rappelle du cas du PDP-11 (machine purement 16 bits, petit-boutienne), version Unix, où les entiers de 32 bits sont généralement rangés dans l'ordre naturel (pour des humains), c'est à dire mot de poids fort avant mot de poids faible. Au résultat, 0x01020304 est rangé en mémoire (adr.basse) 0x0102 (adr.haute) 0x0304 d'où en octets "2143". Ce qui n'est ni le petit boutien "4321" (x86), ni le gros boutien "1234" (Sparc). Mais cela reste l'exception qui confirme la règle; et ici elle aurait été mise de côté par l'implicite règle que le type int est sur 32 bits!
Bien sûr il y a aussi le cas des machines gros boutiennes où les entiers de 32 bits sont rangés sur 64 bits, seule unité connue par la bécane. On aura alors "