Article View: fr.comp.lang.c
Article #15009Re: Struct/Union avec les memes champs
From: Antoine Leca
Date: Wed, 19 Oct 2005 13:08
Date: Wed, 19 Oct 2005 13:08
86 lines
4633 bytes
4633 bytes
Marc Boyer wrote:
Ce genre de question sont trait�es (par forc�ment de mani�re limpides ;-))
dans les paragraphes 6.2 et 6.3. Bonne lecture (non, je ne fournis pas
l'aspirine...)
En g�neral, plut�t que int, il vaut mieux r�fl�chir avec des types tordus,
genre long double 80 bits sur Intel...
> A) Struct qui commencent pareil
> Soient
> typedef struct { int i; } Si;
> typedef struct { int i; char c;} Sic;
> Sic sic;
> Si* psi= (Si*) &sic;
> psi->i= 1; // Est-ce l�gal ? Si oui, un ref ?
D'une part,
6.2.5 Types
[#26] All pointers to
structure types shall have the same representation and
alignment requirements as each other. All pointers to union
types shall have the same representation and alignment
requirements as each other. Pointers to other types need
not have the same representation or alignment requirements.
me para�t interdire une impl�mentation o� les propri�t�s de Si* et Sic*
(genre des types diff�rents de segmentation, _huge* contre _far* ou ce genre
d'horreur) les rendraient incommensurable, donc je pense que le transtypage
de la ligne sup�rieure est l�gal (pas faire boum).
� partir de l�, l'affectation en elle-m�me ne me para�t pas poser de
probl�me... tant que l'on en reste l� !
Par contre, je me pose des questions sur la suite, par exemple sur une
possible subs�quente utilisation de sic.c qui aurait �t� pr�alablement
initialis�...
Par exemple, imaginons une architecture o� l'acc�s � un Si ou � un Sic a le
m�me co�t pour le processeur [non, je ne fournis pas l'aspirine]. Un
compilateur normal va donc allouer la m�me taille aux deux structures (avec
plus de remplissage au bout de Si). L'affectation via psi->i n'a pas de
raison de s'int�resser particuli�rement � cet espace de remplissage, et
comme sur mon hypoth�tique machine c'est moins cher de ranger le tout en
bloc, l'affectation va potentiellement �craser le membre c...
�videmment, dans ton cas particulier avec un membre de type int, j'ai
beaucoup de mal � imaginer une telle machine ;-). Mais remplace int par long
double et alors l�...
L'utilisation d'une union englobante pour faire valoir la r�gle de 6.5.2.3p5
comme l'explique tr�s bien Jean-Marc par ailleurs, ne vaut que pour les
examens ("permitted to inspect the common initial part"), donc pour moi ne
s'applique pas ici.
La question � laquelle je ne r�pond pas (sciemment), c'est la valeur de
sic.i apr�s l'affectation via psi->i :-)
> B) Union avec les m�me champs
> union { char j,k; } f;
> f.j= 'a';
> assert( f.j == f.k); // Est-ce l�gal ? Si oui, ref ?
6.2.6 Representations of types
6.2.6.1 General
[#7] When a value is stored in a member of an object of
union type, the bytes of the object representation that do
not correspond to that member but do correspond to other
members take unspecified values, but the value of the union
object shall not thereby become a trap representation.
Donc cela parait l�gal (pas possible de faire sauter la baraque), mais par
contre ton programme n'est pas strictement conforme (on peut imaginer des
impl�mentations qui surveillent l'assignations aux membres des unions, donc
vont r�pondre non � l'assertion et faire varier le comportement du
programme).
Antoine
Technical Details
Message-ID:
<dj5gg0$ie9$1@shakotay.alphanet.ch>Path:
arc1-ca.pugleaf.net!g2news1.google.com!news1.google.com!proxad.net!212.101.4.254.MISMATCH!solnet.ch!solnet.ch!news.imp.ch!news.imp.ch!80.83.46.147.MISMATCH!news.alphanet.ch!alphanet.ch!not-for-mailReferences:
<slrndlbo6u.9sr.Marc.Boyer@localhost.localdomain>Show Full Headers
Complete Article Headers
X-Google-Thread: f9822,eb7f26af12505976 X-Google-Attributes: gidf9822,public X-Google-Language: FRENCH,ASCII Path: arc1-ca.pugleaf.net!g2news1.google.com!news1.google.com!proxad.net!212.101.4.254.MISMATCH!solnet.ch!solnet.ch!news.imp.ch!news.imp.ch!80.83.46.147.MISMATCH!news.alphanet.ch!alphanet.ch!not-for-mail From: "Antoine Leca" <root@localhost.invalid> Newsgroups: fr.comp.lang.c Subject: Re: Struct/Union avec les memes champs Date: Wed, 19 Oct 2005 15:08:15 +0200 Organization: Posted through ALPHANET (http://www.alphanet.ch/) Lines: 87 Sender: antoinel@212.111.102.30 Message-ID: <dj5gg0$ie9$1@shakotay.alphanet.ch> References: <slrndlbo6u.9sr.Marc.Boyer@localhost.localdomain> NNTP-Posting-Host: 212.111.102.30 Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 8bit X-Trace: shakotay.alphanet.ch 1129727297 18889 212.111.102.30 (19 Oct 2005 13:08:17 GMT) X-Complaints-To: usenet@alphanet.ch NNTP-Posting-Date: Wed, 19 Oct 2005 13:08:17 +0000 (UTC) X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 6.00.2800.1506 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1506