Pourquoi cela au-dessous ne suffirait-il pas ? :
struct message {
[ ... pleins de choses dont pas mal de 'headers' ...];
blob_t *__bufs[2];
[ ... encore pleins de choses ...];
};
parce que lorsque je code et que j'utilise ma structure de message, je ne
veux pas passer par __bufs et écrire des msg->__bufs[0] ou msg->__bufs[1]
et me souvenir lorsque je code que __bufs[0] est mon buffer originel, et
bufs[1] celui où je fait mes modifs.
Dans mon module C je veux utiliser msg->original et msg->scratch qui eux
sont clairs, et en plus comme original a un const en plus, il m'évite
la bêtise d'aller le modifier si je ne suis plus très réveillé.
Pourquoi cela au-dessous ne suffirait-il pas ? :
struct message {
[ ... pleins de choses dont pas mal de 'headers' ...];
blob_t *__bufs[2];
[ ... encore pleins de choses ...];
};
parce que lorsque je code et que j'utilise ma structure de message, je ne
veux pas passer par __bufs et écrire des msg->__bufs[0] ou msg->__bufs[1]
et me souvenir lorsque je code que __bufs[0] est mon buffer originel, et
bufs[1] celui où je fait mes modifs.
Dans mon module C je veux utiliser msg->original et msg->scratch qui eux
sont clairs, et en plus comme original a un const en plus, il m'évite
la bêtise d'aller le modifier si je ne suis plus très réveillé.
Pourquoi cela au-dessous ne suffirait-il pas ? :
struct message {
[ ... pleins de choses dont pas mal de 'headers' ...];
blob_t *__bufs[2];
[ ... encore pleins de choses ...];
};
parce que lorsque je code et que j'utilise ma structure de message, je ne
veux pas passer par __bufs et écrire des msg->__bufs[0] ou msg->__bufs[1]
et me souvenir lorsque je code que __bufs[0] est mon buffer originel, et
bufs[1] celui où je fait mes modifs.
Dans mon module C je veux utiliser msg->original et msg->scratch qui eux
sont clairs, et en plus comme original a un const en plus, il m'évite
la bêtise d'aller le modifier si je ne suis plus très réveillé.
soit dit en passant du coup, je me demande vraiment à quoi ca sert d'autre
que de permettre des vues différentes de la même structure sous-jacente.
Il semble que l'idée derrière l'union soit celle du type variant d'autres
Parce que si il s'agit juste de pouvoir "embarquer" plusieurs types
différents, autant utiliser une zone mémoire pointée depuis un void* ...
ca
offre à peu près les même propriétés.
L'union est quand même plus souple. Déjà, vous n'avez pas à vous préoccuper
Sinon *juste pour ma culture personnelle* -- je ne compte certainement pas
l'utiliser si la norme l'interdit ou ne le spécifie pas -- y a-t-il
vraiment *beaucoup* de compilateurs/architectures où une struct avec deux
pointeurs sur le même type, ne sont pas alignés pareil que un tableau avec
deux de ces pointeurs ?
(sans doute les archis où les pointeurs ont moins de bits que l'entier le
plus grand manipulable par le processeur. mais je doute que de telles
archis soient légion ...)
On pourrait peut-être penser à des pointeurs dont le sizeof serait de 6 et
donc reposons la question autrement. si my_type est un type qui représente
la plus grosse valeur entière manipulable par le système (c'est pas
rigoureux comme définition, mais vous comprendrez sans doute mon point).
est-ce stupide de supposer que :
struct {
my_type a;
my_type b;
}
et my_type c[2] vont être alignés pareils ?
Bien entendu, ce que vous faites dépend du contexte "commercial".
soit dit en passant du coup, je me demande vraiment à quoi ca sert d'autre
que de permettre des vues différentes de la même structure sous-jacente.
Il semble que l'idée derrière l'union soit celle du type variant d'autres
Parce que si il s'agit juste de pouvoir "embarquer" plusieurs types
différents, autant utiliser une zone mémoire pointée depuis un void* ...
ca
offre à peu près les même propriétés.
L'union est quand même plus souple. Déjà, vous n'avez pas à vous préoccuper
Sinon *juste pour ma culture personnelle* -- je ne compte certainement pas
l'utiliser si la norme l'interdit ou ne le spécifie pas -- y a-t-il
vraiment *beaucoup* de compilateurs/architectures où une struct avec deux
pointeurs sur le même type, ne sont pas alignés pareil que un tableau avec
deux de ces pointeurs ?
(sans doute les archis où les pointeurs ont moins de bits que l'entier le
plus grand manipulable par le processeur. mais je doute que de telles
archis soient légion ...)
On pourrait peut-être penser à des pointeurs dont le sizeof serait de 6 et
donc reposons la question autrement. si my_type est un type qui représente
la plus grosse valeur entière manipulable par le système (c'est pas
rigoureux comme définition, mais vous comprendrez sans doute mon point).
est-ce stupide de supposer que :
struct {
my_type a;
my_type b;
}
et my_type c[2] vont être alignés pareils ?
Bien entendu, ce que vous faites dépend du contexte "commercial".
soit dit en passant du coup, je me demande vraiment à quoi ca sert d'autre
que de permettre des vues différentes de la même structure sous-jacente.
Il semble que l'idée derrière l'union soit celle du type variant d'autres
Parce que si il s'agit juste de pouvoir "embarquer" plusieurs types
différents, autant utiliser une zone mémoire pointée depuis un void* ...
ca
offre à peu près les même propriétés.
L'union est quand même plus souple. Déjà, vous n'avez pas à vous préoccuper
Sinon *juste pour ma culture personnelle* -- je ne compte certainement pas
l'utiliser si la norme l'interdit ou ne le spécifie pas -- y a-t-il
vraiment *beaucoup* de compilateurs/architectures où une struct avec deux
pointeurs sur le même type, ne sont pas alignés pareil que un tableau avec
deux de ces pointeurs ?
(sans doute les archis où les pointeurs ont moins de bits que l'entier le
plus grand manipulable par le processeur. mais je doute que de telles
archis soient légion ...)
On pourrait peut-être penser à des pointeurs dont le sizeof serait de 6 et
donc reposons la question autrement. si my_type est un type qui représente
la plus grosse valeur entière manipulable par le système (c'est pas
rigoureux comme définition, mais vous comprendrez sans doute mon point).
est-ce stupide de supposer que :
struct {
my_type a;
my_type b;
}
et my_type c[2] vont être alignés pareils ?
Bien entendu, ce que vous faites dépend du contexte "commercial".
Sinon *juste pour ma culture personnelle* -- je ne compte
certainement pas l'utiliser si la norme l'interdit
ou ne le spécifie
pas -- y a-t-il vraiment *beaucoup* de compilateurs/architectures où
une struct avec deux pointeurs sur le même type, ne sont pas alignés
pareil que un tableau avec deux de ces pointeurs ?
(sans doute les archis où les pointeurs ont moins de bits que
l'entier le plus grand manipulable par le processeur. mais je doute
que de telles archis soient légion ...)
donc reposons la question autrement. si my_type est un type qui
représente la plus grosse valeur entière manipulable par le système
(c'est pas rigoureux comme définition, mais vous comprendrez sans
doute mon point). est-ce stupide de supposer que :
struct {
my_type a;
my_type b;
}
et my_type c[2] vont être alignés pareils ?
Sinon *juste pour ma culture personnelle* -- je ne compte
certainement pas l'utiliser si la norme l'interdit
ou ne le spécifie
pas -- y a-t-il vraiment *beaucoup* de compilateurs/architectures où
une struct avec deux pointeurs sur le même type, ne sont pas alignés
pareil que un tableau avec deux de ces pointeurs ?
(sans doute les archis où les pointeurs ont moins de bits que
l'entier le plus grand manipulable par le processeur. mais je doute
que de telles archis soient légion ...)
donc reposons la question autrement. si my_type est un type qui
représente la plus grosse valeur entière manipulable par le système
(c'est pas rigoureux comme définition, mais vous comprendrez sans
doute mon point). est-ce stupide de supposer que :
struct {
my_type a;
my_type b;
}
et my_type c[2] vont être alignés pareils ?
Sinon *juste pour ma culture personnelle* -- je ne compte
certainement pas l'utiliser si la norme l'interdit
ou ne le spécifie
pas -- y a-t-il vraiment *beaucoup* de compilateurs/architectures où
une struct avec deux pointeurs sur le même type, ne sont pas alignés
pareil que un tableau avec deux de ces pointeurs ?
(sans doute les archis où les pointeurs ont moins de bits que
l'entier le plus grand manipulable par le processeur. mais je doute
que de telles archis soient légion ...)
donc reposons la question autrement. si my_type est un type qui
représente la plus grosse valeur entière manipulable par le système
(c'est pas rigoureux comme définition, mais vous comprendrez sans
doute mon point). est-ce stupide de supposer que :
struct {
my_type a;
my_type b;
}
et my_type c[2] vont être alignés pareils ?
Harpo wrote:Pierre Habouzit wrote:struct message {
[ ... pleins de choses dont pas mal de 'headers' ...];
struct {
const blob_t *original;
blob_t *scratch;
};
Pourquoi garder la structure au dessus, et -peut-être suis-je mal
réveillé- comment y accéder sans la nommer ?
bah tu peux y accéder par hdr->scratch.
Harpo wrote:
Pierre Habouzit wrote:
struct message {
[ ... pleins de choses dont pas mal de 'headers' ...];
struct {
const blob_t *original;
blob_t *scratch;
};
Pourquoi garder la structure au dessus, et -peut-être suis-je mal
réveillé- comment y accéder sans la nommer ?
bah tu peux y accéder par hdr->scratch.
Harpo wrote:Pierre Habouzit wrote:struct message {
[ ... pleins de choses dont pas mal de 'headers' ...];
struct {
const blob_t *original;
blob_t *scratch;
};
Pourquoi garder la structure au dessus, et -peut-être suis-je mal
réveillé- comment y accéder sans la nommer ?
bah tu peux y accéder par hdr->scratch.
(*) Emmanuel (de l'hébreu imanu-el ,"Dieu avec nous") est le nom sous lequel
le prophète Isaïe désigne, dans l'Ecriture sainte, le Messie ou Sauveur
promis au monde. Saint Emmanuel fut martyr en Orient.
(*) Emmanuel (de l'hébreu imanu-el ,"Dieu avec nous") est le nom sous lequel
le prophète Isaïe désigne, dans l'Ecriture sainte, le Messie ou Sauveur
promis au monde. Saint Emmanuel fut martyr en Orient.
(*) Emmanuel (de l'hébreu imanu-el ,"Dieu avec nous") est le nom sous lequel
le prophète Isaïe désigne, dans l'Ecriture sainte, le Messie ou Sauveur
promis au monde. Saint Emmanuel fut martyr en Orient.
Pierre Maurette wrote on 19/09/05 :(*) Emmanuel (de l'hébreu imanu-el ,"Dieu avec nous") est le nom sous lequel
le prophète Isaïe désigne, dans l'Ecriture sainte, le Messie ou Sauveur
promis au monde. Saint Emmanuel fut martyr en Orient.
Comme souvent, on est pas responsable de son prénom... Tu penses faire
quoi en étalant ta science de comptoir ?
Pierre Maurette wrote on 19/09/05 :
(*) Emmanuel (de l'hébreu imanu-el ,"Dieu avec nous") est le nom sous lequel
le prophète Isaïe désigne, dans l'Ecriture sainte, le Messie ou Sauveur
promis au monde. Saint Emmanuel fut martyr en Orient.
Comme souvent, on est pas responsable de son prénom... Tu penses faire
quoi en étalant ta science de comptoir ?
Pierre Maurette wrote on 19/09/05 :(*) Emmanuel (de l'hébreu imanu-el ,"Dieu avec nous") est le nom sous lequel
le prophète Isaïe désigne, dans l'Ecriture sainte, le Messie ou Sauveur
promis au monde. Saint Emmanuel fut martyr en Orient.
Comme souvent, on est pas responsable de son prénom... Tu penses faire
quoi en étalant ta science de comptoir ?
donc reposons la question autrement. si my_type est un type qui
représente la plus grosse valeur entière manipulable par le système
(c'est pas rigoureux comme définition, mais vous comprendrez sans
doute mon point). est-ce stupide de supposer que :
struct {
my_type a;
my_type b;
}
et my_type c[2] vont être alignés pareils ?
Ce n'est pas stupide, c'est seulement non portable.
Contre exemple (un peu mais pas beaucoup tiré par les cheveux, et qui
diffère un peu de ta question, mais je pense que tu sauras extrapoler): au
lieu d'entiers intéressons-nous aux flottants, dans le cadre connu de
l'architecture x86. Les plus grands flottants du microprocesseur sont les
étendus de 80 bits. Pour une cible 32 bits, il y a deux alignements
potentiellement utilisables : frontière de 16 bits (un élément tient sur
80 bits, sizeof), ou frontière de 32 bits (un élément tient sur 96
bits, sizeof) (en 64 bits, on a aussi frontière de 64 bits, avec encore
plus de gâchis).
Je prétend que l'on peut trouver des compilateurs qui vont aligner un
tableau de ces flottants sur la frontière de 16 bits (pour économiser la
place en mémoire quand il s'agit de manipuler de grandes quantités de
données); mais par contre que les membres de structures peuvent être
alignés sur frontière de 32 bits pour accélérer les traitements sur (a
priori) de petites quantités de données. Et grâce à l'agréable propriété
de petits-boutients (l'adresse ne change pas quand on change de type),
cela reste conforme. Par contre, ta supposition ci-dessus ne tient plus.
donc reposons la question autrement. si my_type est un type qui
représente la plus grosse valeur entière manipulable par le système
(c'est pas rigoureux comme définition, mais vous comprendrez sans
doute mon point). est-ce stupide de supposer que :
struct {
my_type a;
my_type b;
}
et my_type c[2] vont être alignés pareils ?
Ce n'est pas stupide, c'est seulement non portable.
Contre exemple (un peu mais pas beaucoup tiré par les cheveux, et qui
diffère un peu de ta question, mais je pense que tu sauras extrapoler): au
lieu d'entiers intéressons-nous aux flottants, dans le cadre connu de
l'architecture x86. Les plus grands flottants du microprocesseur sont les
étendus de 80 bits. Pour une cible 32 bits, il y a deux alignements
potentiellement utilisables : frontière de 16 bits (un élément tient sur
80 bits, sizeof), ou frontière de 32 bits (un élément tient sur 96
bits, sizeof) (en 64 bits, on a aussi frontière de 64 bits, avec encore
plus de gâchis).
Je prétend que l'on peut trouver des compilateurs qui vont aligner un
tableau de ces flottants sur la frontière de 16 bits (pour économiser la
place en mémoire quand il s'agit de manipuler de grandes quantités de
données); mais par contre que les membres de structures peuvent être
alignés sur frontière de 32 bits pour accélérer les traitements sur (a
priori) de petites quantités de données. Et grâce à l'agréable propriété
de petits-boutients (l'adresse ne change pas quand on change de type),
cela reste conforme. Par contre, ta supposition ci-dessus ne tient plus.
donc reposons la question autrement. si my_type est un type qui
représente la plus grosse valeur entière manipulable par le système
(c'est pas rigoureux comme définition, mais vous comprendrez sans
doute mon point). est-ce stupide de supposer que :
struct {
my_type a;
my_type b;
}
et my_type c[2] vont être alignés pareils ?
Ce n'est pas stupide, c'est seulement non portable.
Contre exemple (un peu mais pas beaucoup tiré par les cheveux, et qui
diffère un peu de ta question, mais je pense que tu sauras extrapoler): au
lieu d'entiers intéressons-nous aux flottants, dans le cadre connu de
l'architecture x86. Les plus grands flottants du microprocesseur sont les
étendus de 80 bits. Pour une cible 32 bits, il y a deux alignements
potentiellement utilisables : frontière de 16 bits (un élément tient sur
80 bits, sizeof), ou frontière de 32 bits (un élément tient sur 96
bits, sizeof) (en 64 bits, on a aussi frontière de 64 bits, avec encore
plus de gâchis).
Je prétend que l'on peut trouver des compilateurs qui vont aligner un
tableau de ces flottants sur la frontière de 16 bits (pour économiser la
place en mémoire quand il s'agit de manipuler de grandes quantités de
données); mais par contre que les membres de structures peuvent être
alignés sur frontière de 32 bits pour accélérer les traitements sur (a
priori) de petites quantités de données. Et grâce à l'agréable propriété
de petits-boutients (l'adresse ne change pas quand on change de type),
cela reste conforme. Par contre, ta supposition ci-dessus ne tient plus.
C>type struct.C
typedef int blob_t[5];
struct message {
struct {
const blob_t *original;
blob_t *scratch;
};
} *hdr;
int main() {
hdr->scratch;
return 0;
}
C>bingcc -v -ansi struct.c
Reading specs from bin/../lib/gcc/mingw32/3.4.2/specs
[couic]
GNU C version 3.4.2 (mingw-special) (mingw32)
compiled by GNU C version 3.4.2 (mingw-special).
[couic]
struct.c:7: warning: declaration does not declare anything
struct.c: In function `main':
struct.c:13: error: structure has no member named `scratch'
C>type struct.C
typedef int blob_t[5];
struct message {
struct {
const blob_t *original;
blob_t *scratch;
};
} *hdr;
int main() {
hdr->scratch;
return 0;
}
C>bingcc -v -ansi struct.c
Reading specs from bin/../lib/gcc/mingw32/3.4.2/specs
[couic]
GNU C version 3.4.2 (mingw-special) (mingw32)
compiled by GNU C version 3.4.2 (mingw-special).
[couic]
struct.c:7: warning: declaration does not declare anything
struct.c: In function `main':
struct.c:13: error: structure has no member named `scratch'
C>type struct.C
typedef int blob_t[5];
struct message {
struct {
const blob_t *original;
blob_t *scratch;
};
} *hdr;
int main() {
hdr->scratch;
return 0;
}
C>bingcc -v -ansi struct.c
Reading specs from bin/../lib/gcc/mingw32/3.4.2/specs
[couic]
GNU C version 3.4.2 (mingw-special) (mingw32)
compiled by GNU C version 3.4.2 (mingw-special).
[couic]
struct.c:7: warning: declaration does not declare anything
struct.c: In function `main':
struct.c:13: error: structure has no member named `scratch'
Pierre Maurette wrote on 19/09/05 :(*) Emmanuel (de l'hébreu imanu-el ,"Dieu avec nous") est le nom sous
lequel le prophète Isaïe désigne, dans l'Ecriture sainte, le Messie ou
Sauveur promis au monde. Saint Emmanuel fut martyr en Orient.
Comme souvent, on est pas responsable de son prénom...
Certes, mais le choix d'une identité sur usenet est en quelque sorte
Tu penses faire quoi
en étalant ta science de comptoir ?
Pas science, juste Google.
Pierre Maurette wrote on 19/09/05 :
(*) Emmanuel (de l'hébreu imanu-el ,"Dieu avec nous") est le nom sous
lequel le prophète Isaïe désigne, dans l'Ecriture sainte, le Messie ou
Sauveur promis au monde. Saint Emmanuel fut martyr en Orient.
Comme souvent, on est pas responsable de son prénom...
Certes, mais le choix d'une identité sur usenet est en quelque sorte
Tu penses faire quoi
en étalant ta science de comptoir ?
Pas science, juste Google.
Pierre Maurette wrote on 19/09/05 :(*) Emmanuel (de l'hébreu imanu-el ,"Dieu avec nous") est le nom sous
lequel le prophète Isaïe désigne, dans l'Ecriture sainte, le Messie ou
Sauveur promis au monde. Saint Emmanuel fut martyr en Orient.
Comme souvent, on est pas responsable de son prénom...
Certes, mais le choix d'une identité sur usenet est en quelque sorte
Tu penses faire quoi
en étalant ta science de comptoir ?
Pas science, juste Google.