[...] quoting problem"James Kanze" a écrit dans le message news:
On Jun 12, 7:48 pm, "Patrick 'Zener' Brunet"
wrote:"Patrick 'Zener' Brunet"
a écrit dans le
messagenews:
*********_i?a63jfAD$J'ai des classes qui se veulent "system independent",
et que je dois rendre très compactes.
Dans quel but ? Si tu as d'énormes tableaux des telles classes,
tu pourrais considérer des bit-fields ; ils ont été conçus
précisement pour ça.
J'avais pensé à utiliser des bitfields de 8bits comme "fagots de 8
booléens".
Pourquoi un bit-field de 8 bits si ce sont des booléens ?
Pourquoi pas directement 1 bit ?
Je n'ai pas trop compris ce que tu essaies de faire. Si tu as
des noms du genre bIsNegative, et ton point du départ est
quelque chose du genre :
enum X { ... } ;
struct Toto
{
bool isNegative ;
X attributeX ;
// ...
} ;
Il suffit d'ajouter des spécifications de bit-field à chaque
champs :
struct Toto
{
bool isNegative : 1 ;
X attributeX : 3 ;
// ...
} ;
C'est tout ; le complateur s'occupe de toute la reste.
Maintenant, si tu as d'énormes tableaux des telles structures,
mais tu as aussi des bouts de code où tu en manipules que deux
ou trois, mais qu'il faut que ce soit vite, il se peut que tu
aies besoin de deux structures, un PackedToto et un Toto, parce
que l'accès à un bit-field est nettement moin rapide qu'à un
bool ou à un enum ordinaire. Et du coup, il te faudrait aussi
des fonctions de conversions.
Cela dit, en ce moment côté job je fais de l'IBM TPF, et même là ce
serait
globalement appliquable :o)
Y compris l'ASCII ? La dernière fois que j'ai eu à faire avec
des gros IBM, c'était du CICS, et c'était EBCDIC. Et BCD ou IBM
flottant (et non IEEE) pour les nombres. À part les entiers, on
avait à traduire tout et à l'entrée et à la sortie.
Alors bien sûr un système qui ne fournit pas d'entiers 32 bits semble
sémantiquement assez insuffisant selon cette approche.
Pourquoi est-ce que tu as besoin d'une taille exacte ? En
général, une taille minimum me suffit ; qui peut le plus, peut
le moins. (Il y a quelques exceptions, et je suis partie du
principe d'un type d'exactement 8 bits et un d'exactement 32 ou
64 bits dans mes fonctions SHA et CRC. Mais partout ailleurs,
non.)
En cherchant sur Google, j'ai trouvé beaucoup de sites qui
parlent des formes modifiées d'enum, et c'est pour ça qu'au
début je demandais des liens vers une référence pour tenter de
faire le point.
Entre temps, j'ai vérifié que mon compilo VC6, s'il connaît
bool, ne connaît pas short enum.
Peut-être parce qu'il ne fait pas partie de C++, et n'en a
jamais fait partie, ni de C++ ni de C.
[...] quoting problem
"James Kanze" <james.ka...@gmail.com> a écrit dans le message news:
1181720884.655308.143...@o11g2000prd.googlegroups.com...
On Jun 12, 7:48 pm, "Patrick 'Zener' Brunet"
<use.link.in.signat...@ddress.invalid> wrote:
"Patrick 'Zener' Brunet"
<use.link.in.signat...@ddress.invalid> a écrit dans le
messagenews:
*********_i?a63jfAD$...@shakotay.alphanet.ch...
J'ai des classes qui se veulent "system independent",
et que je dois rendre très compactes.
Dans quel but ? Si tu as d'énormes tableaux des telles classes,
tu pourrais considérer des bit-fields ; ils ont été conçus
précisement pour ça.
J'avais pensé à utiliser des bitfields de 8bits comme "fagots de 8
booléens".
Pourquoi un bit-field de 8 bits si ce sont des booléens ?
Pourquoi pas directement 1 bit ?
Je n'ai pas trop compris ce que tu essaies de faire. Si tu as
des noms du genre bIsNegative, et ton point du départ est
quelque chose du genre :
enum X { ... } ;
struct Toto
{
bool isNegative ;
X attributeX ;
// ...
} ;
Il suffit d'ajouter des spécifications de bit-field à chaque
champs :
struct Toto
{
bool isNegative : 1 ;
X attributeX : 3 ;
// ...
} ;
C'est tout ; le complateur s'occupe de toute la reste.
Maintenant, si tu as d'énormes tableaux des telles structures,
mais tu as aussi des bouts de code où tu en manipules que deux
ou trois, mais qu'il faut que ce soit vite, il se peut que tu
aies besoin de deux structures, un PackedToto et un Toto, parce
que l'accès à un bit-field est nettement moin rapide qu'à un
bool ou à un enum ordinaire. Et du coup, il te faudrait aussi
des fonctions de conversions.
Cela dit, en ce moment côté job je fais de l'IBM TPF, et même là ce
serait
globalement appliquable :o)
Y compris l'ASCII ? La dernière fois que j'ai eu à faire avec
des gros IBM, c'était du CICS, et c'était EBCDIC. Et BCD ou IBM
flottant (et non IEEE) pour les nombres. À part les entiers, on
avait à traduire tout et à l'entrée et à la sortie.
Alors bien sûr un système qui ne fournit pas d'entiers 32 bits semble
sémantiquement assez insuffisant selon cette approche.
Pourquoi est-ce que tu as besoin d'une taille exacte ? En
général, une taille minimum me suffit ; qui peut le plus, peut
le moins. (Il y a quelques exceptions, et je suis partie du
principe d'un type d'exactement 8 bits et un d'exactement 32 ou
64 bits dans mes fonctions SHA et CRC. Mais partout ailleurs,
non.)
En cherchant sur Google, j'ai trouvé beaucoup de sites qui
parlent des formes modifiées d'enum, et c'est pour ça qu'au
début je demandais des liens vers une référence pour tenter de
faire le point.
Entre temps, j'ai vérifié que mon compilo VC6, s'il connaît
bool, ne connaît pas short enum.
Peut-être parce qu'il ne fait pas partie de C++, et n'en a
jamais fait partie, ni de C++ ni de C.
[...] quoting problem"James Kanze" a écrit dans le message news:
On Jun 12, 7:48 pm, "Patrick 'Zener' Brunet"
wrote:"Patrick 'Zener' Brunet"
a écrit dans le
messagenews:
*********_i?a63jfAD$J'ai des classes qui se veulent "system independent",
et que je dois rendre très compactes.
Dans quel but ? Si tu as d'énormes tableaux des telles classes,
tu pourrais considérer des bit-fields ; ils ont été conçus
précisement pour ça.
J'avais pensé à utiliser des bitfields de 8bits comme "fagots de 8
booléens".
Pourquoi un bit-field de 8 bits si ce sont des booléens ?
Pourquoi pas directement 1 bit ?
Je n'ai pas trop compris ce que tu essaies de faire. Si tu as
des noms du genre bIsNegative, et ton point du départ est
quelque chose du genre :
enum X { ... } ;
struct Toto
{
bool isNegative ;
X attributeX ;
// ...
} ;
Il suffit d'ajouter des spécifications de bit-field à chaque
champs :
struct Toto
{
bool isNegative : 1 ;
X attributeX : 3 ;
// ...
} ;
C'est tout ; le complateur s'occupe de toute la reste.
Maintenant, si tu as d'énormes tableaux des telles structures,
mais tu as aussi des bouts de code où tu en manipules que deux
ou trois, mais qu'il faut que ce soit vite, il se peut que tu
aies besoin de deux structures, un PackedToto et un Toto, parce
que l'accès à un bit-field est nettement moin rapide qu'à un
bool ou à un enum ordinaire. Et du coup, il te faudrait aussi
des fonctions de conversions.
Cela dit, en ce moment côté job je fais de l'IBM TPF, et même là ce
serait
globalement appliquable :o)
Y compris l'ASCII ? La dernière fois que j'ai eu à faire avec
des gros IBM, c'était du CICS, et c'était EBCDIC. Et BCD ou IBM
flottant (et non IEEE) pour les nombres. À part les entiers, on
avait à traduire tout et à l'entrée et à la sortie.
Alors bien sûr un système qui ne fournit pas d'entiers 32 bits semble
sémantiquement assez insuffisant selon cette approche.
Pourquoi est-ce que tu as besoin d'une taille exacte ? En
général, une taille minimum me suffit ; qui peut le plus, peut
le moins. (Il y a quelques exceptions, et je suis partie du
principe d'un type d'exactement 8 bits et un d'exactement 32 ou
64 bits dans mes fonctions SHA et CRC. Mais partout ailleurs,
non.)
En cherchant sur Google, j'ai trouvé beaucoup de sites qui
parlent des formes modifiées d'enum, et c'est pour ça qu'au
début je demandais des liens vers une référence pour tenter de
faire le point.
Entre temps, j'ai vérifié que mon compilo VC6, s'il connaît
bool, ne connaît pas short enum.
Peut-être parce qu'il ne fait pas partie de C++, et n'en a
jamais fait partie, ni de C++ ni de C.
"James Kanze" a écrit dans le message news:
On Jun 12, 7:48 pm, "Patrick 'Zener' Brunet"
wrote:"Patrick 'Zener' Brunet"
a écrit dans le
messagenews:
*********_i?a63jfAD$J'ai des classes qui se veulent "system independent",
et que je dois rendre très compactes.
Dans quel but ? Si tu as d'énormes tableaux des telles classes,
tu pourrais considérer des bit-fields ; ils ont été conçus
précisement pour ça.
J'avais pensé à utiliser des bitfields de 8bits comme "fagots de 8
booléens". Le problème c'est qu'il faut faire du typedef spécifique dans
chaque cas d'utilisation, il n'est pas possible de créer un tel type
"fagot"
réutilisable, du moins qui ne soit pas très casse-gueule à
l'utilisation.
Simplement parce qu'on ne peut nommer ainsi que le fagot, pas chacun des
"booléens":
typedef struct
{
int b1 : 1;
...
int b8 : 1;
} OctoBool;
[...]
Et ça ne résoud rien car les contraintes d'alignement font que
potentiellement sizeof(OctoBool)==sizeof(int) a moins d'utiliser un
pragma de type pack si celui ci est dispo mais c'est pas/peu portable.
Donc tes tableaux et structures d'OctoBool sont condamnés au gigantisme :)
A la place de ton octobool, tu peux regarder du coté des biset<> si tu
as des besoins évolués.
A ce que j'ai compris, ce que James Kanze te propose est de définir tes
structures directement avec des bit-fields pour les rendre compacte:
struct foo
{
s32 type:3; file://! type de foo
u32 fonction:10; file://! fonction expected
u32 nbparam:4; file://! number of parameter
u32 bIsNegative:1; file://! negative ?
file://etc...
};
"James Kanze" <james.kanze@gmail.com> a écrit dans le message news:
1181720884.655308.143240@o11g2000prd.googlegroups.com...
On Jun 12, 7:48 pm, "Patrick 'Zener' Brunet"
<use.link.in.signat...@ddress.invalid> wrote:
"Patrick 'Zener' Brunet"
<use.link.in.signat...@ddress.invalid> a écrit dans le
messagenews:
*********_i?a63jfAD$z__@shakotay.alphanet.ch...
J'ai des classes qui se veulent "system independent",
et que je dois rendre très compactes.
Dans quel but ? Si tu as d'énormes tableaux des telles classes,
tu pourrais considérer des bit-fields ; ils ont été conçus
précisement pour ça.
J'avais pensé à utiliser des bitfields de 8bits comme "fagots de 8
booléens". Le problème c'est qu'il faut faire du typedef spécifique dans
chaque cas d'utilisation, il n'est pas possible de créer un tel type
"fagot"
réutilisable, du moins qui ne soit pas très casse-gueule à
l'utilisation.
Simplement parce qu'on ne peut nommer ainsi que le fagot, pas chacun des
"booléens":
typedef struct
{
int b1 : 1;
...
int b8 : 1;
} OctoBool;
[...]
Et ça ne résoud rien car les contraintes d'alignement font que
potentiellement sizeof(OctoBool)==sizeof(int) a moins d'utiliser un
pragma de type pack si celui ci est dispo mais c'est pas/peu portable.
Donc tes tableaux et structures d'OctoBool sont condamnés au gigantisme :)
A la place de ton octobool, tu peux regarder du coté des biset<> si tu
as des besoins évolués.
A ce que j'ai compris, ce que James Kanze te propose est de définir tes
structures directement avec des bit-fields pour les rendre compacte:
struct foo
{
s32 type:3; file://! type de foo
u32 fonction:10; file://! fonction expected
u32 nbparam:4; file://! number of parameter
u32 bIsNegative:1; file://! negative ?
file://etc...
};
"James Kanze" a écrit dans le message news:
On Jun 12, 7:48 pm, "Patrick 'Zener' Brunet"
wrote:"Patrick 'Zener' Brunet"
a écrit dans le
messagenews:
*********_i?a63jfAD$J'ai des classes qui se veulent "system independent",
et que je dois rendre très compactes.
Dans quel but ? Si tu as d'énormes tableaux des telles classes,
tu pourrais considérer des bit-fields ; ils ont été conçus
précisement pour ça.
J'avais pensé à utiliser des bitfields de 8bits comme "fagots de 8
booléens". Le problème c'est qu'il faut faire du typedef spécifique dans
chaque cas d'utilisation, il n'est pas possible de créer un tel type
"fagot"
réutilisable, du moins qui ne soit pas très casse-gueule à
l'utilisation.
Simplement parce qu'on ne peut nommer ainsi que le fagot, pas chacun des
"booléens":
typedef struct
{
int b1 : 1;
...
int b8 : 1;
} OctoBool;
[...]
Et ça ne résoud rien car les contraintes d'alignement font que
potentiellement sizeof(OctoBool)==sizeof(int) a moins d'utiliser un
pragma de type pack si celui ci est dispo mais c'est pas/peu portable.
Donc tes tableaux et structures d'OctoBool sont condamnés au gigantisme :)
A la place de ton octobool, tu peux regarder du coté des biset<> si tu
as des besoins évolués.
A ce que j'ai compris, ce que James Kanze te propose est de définir tes
structures directement avec des bit-fields pour les rendre compacte:
struct foo
{
s32 type:3; file://! type de foo
u32 fonction:10; file://! fonction expected
u32 nbparam:4; file://! number of parameter
u32 bIsNegative:1; file://! negative ?
file://etc...
};
Le jeudi 14 juin 2007 à 09:05:13, James Kanze a écrit dans
fr.comp.lang.c++ :Tout quoté à la main, ce *$#&! de OE ne reconnaît pas ton encoda ge :-@
Je sais. Il y a quelque chose de particulier qui s'ajoute à mes
postings quand je poste du travail. Je suis en train d'en
chercher la cause,
Google publie en Quoted-Printable ; c'est ça qu'OE refuse de citer.
--
___________
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Pour bien répondre avec Google, ne pas cliquer
-'(__) « Répondre », mais « Afficher les options »,
_/___(_) puis cliquer « Répondre » (parmi les options).
Le jeudi 14 juin 2007 à 09:05:13, James Kanze a écrit dans
fr.comp.lang.c++ :
Tout quoté à la main, ce *$#&! de OE ne reconnaît pas ton encoda ge :-@
Je sais. Il y a quelque chose de particulier qui s'ajoute à mes
postings quand je poste du travail. Je suis en train d'en
chercher la cause,
Google publie en Quoted-Printable ; c'est ça qu'OE refuse de citer.
--
___________
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Pour bien répondre avec Google, ne pas cliquer
-'(__) « Répondre », mais « Afficher les options »,
_/___(_) puis cliquer « Répondre » (parmi les options).
Le jeudi 14 juin 2007 à 09:05:13, James Kanze a écrit dans
fr.comp.lang.c++ :Tout quoté à la main, ce *$#&! de OE ne reconnaît pas ton encoda ge :-@
Je sais. Il y a quelque chose de particulier qui s'ajoute à mes
postings quand je poste du travail. Je suis en train d'en
chercher la cause,
Google publie en Quoted-Printable ; c'est ça qu'OE refuse de citer.
--
___________
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Pour bien répondre avec Google, ne pas cliquer
-'(__) « Répondre », mais « Afficher les options »,
_/___(_) puis cliquer « Répondre » (parmi les options).
Le jeudi 14 juin 2007 à 09:05:13, James Kanze a écrit dans
fr.comp.lang.c++ :Tout quoté à la main, ce *$#&! de OE ne reconnaît pas ton encoda ge :-@
Je sais. Il y a quelque chose de particulier qui s'ajoute à mes
postings quand je poste du travail. Je suis en train d'en
chercher la cause,
Google publie en Quoted-Printable ; c'est ça qu'OE refuse de citer.
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Pour bien répondre avec Google, ne pas cliquer
-'(__) « Répondre », mais « Afficher les options »,
_/___(_) puis cliquer « Répondre » (parmi les options).
Le jeudi 14 juin 2007 à 09:05:13, James Kanze a écrit dans
fr.comp.lang.c++ :
Tout quoté à la main, ce *$#&! de OE ne reconnaît pas ton encoda ge :-@
Je sais. Il y a quelque chose de particulier qui s'ajoute à mes
postings quand je poste du travail. Je suis en train d'en
chercher la cause,
Google publie en Quoted-Printable ; c'est ça qu'OE refuse de citer.
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Pour bien répondre avec Google, ne pas cliquer
-'(__) « Répondre », mais « Afficher les options »,
_/___(_) puis cliquer « Répondre » (parmi les options).
Le jeudi 14 juin 2007 à 09:05:13, James Kanze a écrit dans
fr.comp.lang.c++ :Tout quoté à la main, ce *$#&! de OE ne reconnaît pas ton encoda ge :-@
Je sais. Il y a quelque chose de particulier qui s'ajoute à mes
postings quand je poste du travail. Je suis en train d'en
chercher la cause,
Google publie en Quoted-Printable ; c'est ça qu'OE refuse de citer.
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Pour bien répondre avec Google, ne pas cliquer
-'(__) « Répondre », mais « Afficher les options »,
_/___(_) puis cliquer « Répondre » (parmi les options).
"James Kanze" a écrit dans le message news:
On Jun 13, 9:54 pm, "Patrick 'Zener' Brunet"
wrote:[...] quoting problem"James Kanze" a écrit dans le message news:
On Jun 12, 7:48 pm, "Patrick 'Zener' Brunet"
wrote:"Patrick 'Zener' Brunet"
a écrit dans le
messagenews:
*********_i?a63jfAD$J'ai des classes qui se veulent "system independent",
et que je dois rendre très compactes.
Dans quel but ? Si tu as d'énormes tableaux des telles classes,
tu pourrais considérer des bit-fields ; ils ont été conçus
précisement pour ça.
J'avais pensé à utiliser des bitfields de 8bits comme "fagots de 8
booléens".
Pourquoi un bit-field de 8 bits si ce sont des booléens ?
Pourquoi pas directement 1 bit ?
Ma démarche étant de créer des types de base réutilisables, le
minimum pour ça est 1 octet. Sinon il faut faire un bitfield
global avec tous les membres de la structure, comme dans ton
exemple ci-dessous.
Disons que le type de 1 octet est un bon compromis pour moi: générale ment
dans une classe genre noeud d'arbre, valeur temporelle, ou autre élém ent de
base d'une donnée complexe, on peut s'attendre à trouver de 1 à 3 b ooléens
et de 1 à 2 enums, plus quelques entiers.
Donc avec des types de 1 octet quand c'est possible, en les ordonnant bie n,
on peut gagner dans les 16 octets sur cet exemple.
[...] exemple de "fagots"
Donc là j'avais même envisagé de regrouper plusieurs booléens sur un seul
octet, mais c'est sémantiquement horrible si on veut en faire un type
réutilisable, c'était le sens de la démo.
Je n'ai pas trop compris ce que tu essaies de faire. Si tu as
des noms du genre bIsNegative, et ton point du départ est
quelque chose du genre :
enum X { ... } ;
struct Toto
{
bool isNegative ;
X attributeX ;
// ...
} ;
Il suffit d'ajouter des spécifications de bit-field à chaque
champs :
struct Toto
{
bool isNegative : 1 ;
X attributeX : 3 ;
// ...
} ;
C'est tout ; le complateur s'occupe de toute la reste.
Tiens, je ne savais pas que la syntaxe bitwidth (: n;) pouvait s'applique r à
des types non-entiers...
Mais ça m'embête un peu de faire ça avec une class, et donc par ail leurs
exit les types génériques.
Je le ferai avec une structure si c'est vraiment indispensable, mais le g ain
décrit ci-dessus me paraît convenable.Maintenant, si tu as d'énormes tableaux des telles structures,
mais tu as aussi des bouts de code où tu en manipules que deux
ou trois, mais qu'il faut que ce soit vite, il se peut que tu
aies besoin de deux structures, un PackedToto et un Toto, parce
que l'accès à un bit-field est nettement moin rapide qu'à un
bool ou à un enum ordinaire. Et du coup, il te faudrait aussi
des fonctions de conversions.
Certes. Ca plaide aussi contre le bitfield global.
[...]Cela dit, en ce moment côté job je fais de l'IBM TPF, et
même là ce serait globalement appliquable :o)
Y compris l'ASCII ? La dernière fois que j'ai eu à faire avec
des gros IBM, c'était du CICS, et c'était EBCDIC. Et BCD ou IBM
flottant (et non IEEE) pour les nombres. À part les entiers, on
avait à traduire tout et à l'entrée et à la sortie.
Certes.
Mais ça peut être évité s'il n'y a pas d'échange de données e ntre
l'extérieur et l'intérieur d'un système, du moins dans la partie "m oteur"
qui est le domaine de ces classes (donc ça relève de l'interface
spécifique).
Donc en interne, la seule singularité énorme et "buggante" de EBCDIC, c'est
qu'il y a des trous entre les plages de lettres, et que les chiffres
viennent après. Mais si le code ne fait pas de suppositions contradicto ires,
se basant sur les isdigit(), isalpha() et autres, il peut rester portable.
[...]En cherchant sur Google, j'ai trouvé beaucoup de sites qui
parlent des formes modifiées d'enum, et c'est pour ça qu'au
début je demandais des liens vers une référence pour tenter de
faire le point.
Entre temps, j'ai vérifié que mon compilo VC6, s'il connaît
bool, ne connaît pas short enum.
Peut-être parce qu'il ne fait pas partie de C++, et n'en a
jamais fait partie, ni de C++ ni de C.
Un bonus bidon offert par certains compilos alors ? :-/
En tout cas il y a beaucoup de gens qui semblent se poser la question,
besoin ou pas... J'ai même vu un article sur WikiPedia, mais je ne le
retrouve plus.
Bon, pour ceux que ça pourrait dépanner, je vous offre ci-dessous les deux
petites classes que je me suis faites pour traiter le problème. J'ai fa it
des essais et j'arrive à ce que je voulais: avec un char comme donnée , elles
tiennent sur 1 octet, même groupées en tableaux.
Ceci en utilisant le pragma de Pack de mon compilo, ce que je fais de
manière portable grâce à l'astuce ci-dessous aussi.
======================== ======
#define EZ_ALIGN_UNIT 1 /* Packed class */
#include <EzLocalPragma.h>
template< class T, class E>
class CSizedEnum
{
private:
T xValue;
public:
inline
CSizedEnum( void)
{
xValue = 0; /* Generally invalid until assigned */
};
inline
CSizedEnum( E const & rkeSource)
"James Kanze" <james.ka...@gmail.com> a écrit dans le message news:
1181804713.782940.219...@g37g2000prf.googlegroups.com...
On Jun 13, 9:54 pm, "Patrick 'Zener' Brunet"
<use.link.in.signat...@ddress.invalid> wrote:
[...] quoting problem
"James Kanze" <james.ka...@gmail.com> a écrit dans le message news:
1181720884.655308.143...@o11g2000prd.googlegroups.com...
On Jun 12, 7:48 pm, "Patrick 'Zener' Brunet"
<use.link.in.signat...@ddress.invalid> wrote:
"Patrick 'Zener' Brunet"
<use.link.in.signat...@ddress.invalid> a écrit dans le
messagenews:
*********_i?a63jfAD$...@shakotay.alphanet.ch...
J'ai des classes qui se veulent "system independent",
et que je dois rendre très compactes.
Dans quel but ? Si tu as d'énormes tableaux des telles classes,
tu pourrais considérer des bit-fields ; ils ont été conçus
précisement pour ça.
J'avais pensé à utiliser des bitfields de 8bits comme "fagots de 8
booléens".
Pourquoi un bit-field de 8 bits si ce sont des booléens ?
Pourquoi pas directement 1 bit ?
Ma démarche étant de créer des types de base réutilisables, le
minimum pour ça est 1 octet. Sinon il faut faire un bitfield
global avec tous les membres de la structure, comme dans ton
exemple ci-dessous.
Disons que le type de 1 octet est un bon compromis pour moi: générale ment
dans une classe genre noeud d'arbre, valeur temporelle, ou autre élém ent de
base d'une donnée complexe, on peut s'attendre à trouver de 1 à 3 b ooléens
et de 1 à 2 enums, plus quelques entiers.
Donc avec des types de 1 octet quand c'est possible, en les ordonnant bie n,
on peut gagner dans les 16 octets sur cet exemple.
[...] exemple de "fagots"
Donc là j'avais même envisagé de regrouper plusieurs booléens sur un seul
octet, mais c'est sémantiquement horrible si on veut en faire un type
réutilisable, c'était le sens de la démo.
Je n'ai pas trop compris ce que tu essaies de faire. Si tu as
des noms du genre bIsNegative, et ton point du départ est
quelque chose du genre :
enum X { ... } ;
struct Toto
{
bool isNegative ;
X attributeX ;
// ...
} ;
Il suffit d'ajouter des spécifications de bit-field à chaque
champs :
struct Toto
{
bool isNegative : 1 ;
X attributeX : 3 ;
// ...
} ;
C'est tout ; le complateur s'occupe de toute la reste.
Tiens, je ne savais pas que la syntaxe bitwidth (: n;) pouvait s'applique r à
des types non-entiers...
Mais ça m'embête un peu de faire ça avec une class, et donc par ail leurs
exit les types génériques.
Je le ferai avec une structure si c'est vraiment indispensable, mais le g ain
décrit ci-dessus me paraît convenable.
Maintenant, si tu as d'énormes tableaux des telles structures,
mais tu as aussi des bouts de code où tu en manipules que deux
ou trois, mais qu'il faut que ce soit vite, il se peut que tu
aies besoin de deux structures, un PackedToto et un Toto, parce
que l'accès à un bit-field est nettement moin rapide qu'à un
bool ou à un enum ordinaire. Et du coup, il te faudrait aussi
des fonctions de conversions.
Certes. Ca plaide aussi contre le bitfield global.
[...]
Cela dit, en ce moment côté job je fais de l'IBM TPF, et
même là ce serait globalement appliquable :o)
Y compris l'ASCII ? La dernière fois que j'ai eu à faire avec
des gros IBM, c'était du CICS, et c'était EBCDIC. Et BCD ou IBM
flottant (et non IEEE) pour les nombres. À part les entiers, on
avait à traduire tout et à l'entrée et à la sortie.
Certes.
Mais ça peut être évité s'il n'y a pas d'échange de données e ntre
l'extérieur et l'intérieur d'un système, du moins dans la partie "m oteur"
qui est le domaine de ces classes (donc ça relève de l'interface
spécifique).
Donc en interne, la seule singularité énorme et "buggante" de EBCDIC, c'est
qu'il y a des trous entre les plages de lettres, et que les chiffres
viennent après. Mais si le code ne fait pas de suppositions contradicto ires,
se basant sur les isdigit(), isalpha() et autres, il peut rester portable.
[...]
En cherchant sur Google, j'ai trouvé beaucoup de sites qui
parlent des formes modifiées d'enum, et c'est pour ça qu'au
début je demandais des liens vers une référence pour tenter de
faire le point.
Entre temps, j'ai vérifié que mon compilo VC6, s'il connaît
bool, ne connaît pas short enum.
Peut-être parce qu'il ne fait pas partie de C++, et n'en a
jamais fait partie, ni de C++ ni de C.
Un bonus bidon offert par certains compilos alors ? :-/
En tout cas il y a beaucoup de gens qui semblent se poser la question,
besoin ou pas... J'ai même vu un article sur WikiPedia, mais je ne le
retrouve plus.
Bon, pour ceux que ça pourrait dépanner, je vous offre ci-dessous les deux
petites classes que je me suis faites pour traiter le problème. J'ai fa it
des essais et j'arrive à ce que je voulais: avec un char comme donnée , elles
tiennent sur 1 octet, même groupées en tableaux.
Ceci en utilisant le pragma de Pack de mon compilo, ce que je fais de
manière portable grâce à l'astuce ci-dessous aussi.
======================== ======
#define EZ_ALIGN_UNIT 1 /* Packed class */
#include <EzLocalPragma.h>
template< class T, class E>
class CSizedEnum
{
private:
T xValue;
public:
inline
CSizedEnum( void)
{
xValue = 0; /* Generally invalid until assigned */
};
inline
CSizedEnum( E const & rkeSource)
"James Kanze" a écrit dans le message news:
On Jun 13, 9:54 pm, "Patrick 'Zener' Brunet"
wrote:[...] quoting problem"James Kanze" a écrit dans le message news:
On Jun 12, 7:48 pm, "Patrick 'Zener' Brunet"
wrote:"Patrick 'Zener' Brunet"
a écrit dans le
messagenews:
*********_i?a63jfAD$J'ai des classes qui se veulent "system independent",
et que je dois rendre très compactes.
Dans quel but ? Si tu as d'énormes tableaux des telles classes,
tu pourrais considérer des bit-fields ; ils ont été conçus
précisement pour ça.
J'avais pensé à utiliser des bitfields de 8bits comme "fagots de 8
booléens".
Pourquoi un bit-field de 8 bits si ce sont des booléens ?
Pourquoi pas directement 1 bit ?
Ma démarche étant de créer des types de base réutilisables, le
minimum pour ça est 1 octet. Sinon il faut faire un bitfield
global avec tous les membres de la structure, comme dans ton
exemple ci-dessous.
Disons que le type de 1 octet est un bon compromis pour moi: générale ment
dans une classe genre noeud d'arbre, valeur temporelle, ou autre élém ent de
base d'une donnée complexe, on peut s'attendre à trouver de 1 à 3 b ooléens
et de 1 à 2 enums, plus quelques entiers.
Donc avec des types de 1 octet quand c'est possible, en les ordonnant bie n,
on peut gagner dans les 16 octets sur cet exemple.
[...] exemple de "fagots"
Donc là j'avais même envisagé de regrouper plusieurs booléens sur un seul
octet, mais c'est sémantiquement horrible si on veut en faire un type
réutilisable, c'était le sens de la démo.
Je n'ai pas trop compris ce que tu essaies de faire. Si tu as
des noms du genre bIsNegative, et ton point du départ est
quelque chose du genre :
enum X { ... } ;
struct Toto
{
bool isNegative ;
X attributeX ;
// ...
} ;
Il suffit d'ajouter des spécifications de bit-field à chaque
champs :
struct Toto
{
bool isNegative : 1 ;
X attributeX : 3 ;
// ...
} ;
C'est tout ; le complateur s'occupe de toute la reste.
Tiens, je ne savais pas que la syntaxe bitwidth (: n;) pouvait s'applique r à
des types non-entiers...
Mais ça m'embête un peu de faire ça avec une class, et donc par ail leurs
exit les types génériques.
Je le ferai avec une structure si c'est vraiment indispensable, mais le g ain
décrit ci-dessus me paraît convenable.Maintenant, si tu as d'énormes tableaux des telles structures,
mais tu as aussi des bouts de code où tu en manipules que deux
ou trois, mais qu'il faut que ce soit vite, il se peut que tu
aies besoin de deux structures, un PackedToto et un Toto, parce
que l'accès à un bit-field est nettement moin rapide qu'à un
bool ou à un enum ordinaire. Et du coup, il te faudrait aussi
des fonctions de conversions.
Certes. Ca plaide aussi contre le bitfield global.
[...]Cela dit, en ce moment côté job je fais de l'IBM TPF, et
même là ce serait globalement appliquable :o)
Y compris l'ASCII ? La dernière fois que j'ai eu à faire avec
des gros IBM, c'était du CICS, et c'était EBCDIC. Et BCD ou IBM
flottant (et non IEEE) pour les nombres. À part les entiers, on
avait à traduire tout et à l'entrée et à la sortie.
Certes.
Mais ça peut être évité s'il n'y a pas d'échange de données e ntre
l'extérieur et l'intérieur d'un système, du moins dans la partie "m oteur"
qui est le domaine de ces classes (donc ça relève de l'interface
spécifique).
Donc en interne, la seule singularité énorme et "buggante" de EBCDIC, c'est
qu'il y a des trous entre les plages de lettres, et que les chiffres
viennent après. Mais si le code ne fait pas de suppositions contradicto ires,
se basant sur les isdigit(), isalpha() et autres, il peut rester portable.
[...]En cherchant sur Google, j'ai trouvé beaucoup de sites qui
parlent des formes modifiées d'enum, et c'est pour ça qu'au
début je demandais des liens vers une référence pour tenter de
faire le point.
Entre temps, j'ai vérifié que mon compilo VC6, s'il connaît
bool, ne connaît pas short enum.
Peut-être parce qu'il ne fait pas partie de C++, et n'en a
jamais fait partie, ni de C++ ni de C.
Un bonus bidon offert par certains compilos alors ? :-/
En tout cas il y a beaucoup de gens qui semblent se poser la question,
besoin ou pas... J'ai même vu un article sur WikiPedia, mais je ne le
retrouve plus.
Bon, pour ceux que ça pourrait dépanner, je vous offre ci-dessous les deux
petites classes que je me suis faites pour traiter le problème. J'ai fa it
des essais et j'arrive à ce que je voulais: avec un char comme donnée , elles
tiennent sur 1 octet, même groupées en tableaux.
Ceci en utilisant le pragma de Pack de mon compilo, ce que je fais de
manière portable grâce à l'astuce ci-dessous aussi.
======================== ======
#define EZ_ALIGN_UNIT 1 /* Packed class */
#include <EzLocalPragma.h>
template< class T, class E>
class CSizedEnum
{
private:
T xValue;
public:
inline
CSizedEnum( void)
{
xValue = 0; /* Generally invalid until assigned */
};
inline
CSizedEnum( E const & rkeSource)
Donc là j'avais même envisagé de regrouper plusieurs booléens sur un seul
octet, mais c'est sémantiquement horrible si on veut en faire un type
réutilisable, c'était le sens de la démo.
Donc là j'avais même envisagé de regrouper plusieurs booléens sur un seul
octet, mais c'est sémantiquement horrible si on veut en faire un type
réutilisable, c'était le sens de la démo.
Donc là j'avais même envisagé de regrouper plusieurs booléens sur un seul
octet, mais c'est sémantiquement horrible si on veut en faire un type
réutilisable, c'était le sens de la démo.
"James Kanze" a écrit dans le message news:
On Jun 13, 9:54 pm, "Patrick 'Zener' Brunet"
wrote:[...] quoting problem"James Kanze" a écrit dans le message news:
On Jun 12, 7:48 pm, "Patrick 'Zener' Brunet"
wrote:"Patrick 'Zener' Brunet"
a écrit dans le
messagenews:
*********_i?a63jfAD$
[...]
Bon, pour ceux que ça pourrait dépanner, je vous offre ci-dessous les
deux
petites classes que je me suis faites pour traiter le problème. J'ai
fait
des essais et j'arrive à ce que je voulais: avec un char comme donnée,
elles
tiennent sur 1 octet, même groupées en tableaux.
Ceci en utilisant le pragma de Pack de mon compilo, ce que je fais de
manière portable grâce à l'astuce ci-dessous aussi.
Just une petite remarque...
=============================
#define EZ_ALIGN_UNIT 1 /* Packed class */
#include <EzLocalPragma.h>
template< class T, class E>
Je suppose que T serait toujours un type entier, et E un enum.
Donc...class CSizedEnum
{
private:
T xValue;
public:
inline
CSizedEnum( void)
{
xValue = 0; /* Generally invalid until assigned */
};
inline
CSizedEnum( E const & rkeSource)
Ne serait-il pas préferable (ou au moins plus habituel) de
passer le paramètre par valeur ?
"James Kanze" <james.ka...@gmail.com> a écrit dans le message news:
1181804713.782940.219...@g37g2000prf.googlegroups.com...
On Jun 13, 9:54 pm, "Patrick 'Zener' Brunet"
<use.link.in.signat...@ddress.invalid> wrote:
[...] quoting problem
"James Kanze" <james.ka...@gmail.com> a écrit dans le message news:
1181720884.655308.143...@o11g2000prd.googlegroups.com...
On Jun 12, 7:48 pm, "Patrick 'Zener' Brunet"
<use.link.in.signat...@ddress.invalid> wrote:
"Patrick 'Zener' Brunet"
<use.link.in.signat...@ddress.invalid> a écrit dans le
messagenews:
*********_i?a63jfAD$...@shakotay.alphanet.ch...
[...]
Bon, pour ceux que ça pourrait dépanner, je vous offre ci-dessous les
deux
petites classes que je me suis faites pour traiter le problème. J'ai
fait
des essais et j'arrive à ce que je voulais: avec un char comme donnée,
elles
tiennent sur 1 octet, même groupées en tableaux.
Ceci en utilisant le pragma de Pack de mon compilo, ce que je fais de
manière portable grâce à l'astuce ci-dessous aussi.
Just une petite remarque...
=============================
#define EZ_ALIGN_UNIT 1 /* Packed class */
#include <EzLocalPragma.h>
template< class T, class E>
Je suppose que T serait toujours un type entier, et E un enum.
Donc...
class CSizedEnum
{
private:
T xValue;
public:
inline
CSizedEnum( void)
{
xValue = 0; /* Generally invalid until assigned */
};
inline
CSizedEnum( E const & rkeSource)
Ne serait-il pas préferable (ou au moins plus habituel) de
passer le paramètre par valeur ?
"James Kanze" a écrit dans le message news:
On Jun 13, 9:54 pm, "Patrick 'Zener' Brunet"
wrote:[...] quoting problem"James Kanze" a écrit dans le message news:
On Jun 12, 7:48 pm, "Patrick 'Zener' Brunet"
wrote:"Patrick 'Zener' Brunet"
a écrit dans le
messagenews:
*********_i?a63jfAD$
[...]
Bon, pour ceux que ça pourrait dépanner, je vous offre ci-dessous les
deux
petites classes que je me suis faites pour traiter le problème. J'ai
fait
des essais et j'arrive à ce que je voulais: avec un char comme donnée,
elles
tiennent sur 1 octet, même groupées en tableaux.
Ceci en utilisant le pragma de Pack de mon compilo, ce que je fais de
manière portable grâce à l'astuce ci-dessous aussi.
Just une petite remarque...
=============================
#define EZ_ALIGN_UNIT 1 /* Packed class */
#include <EzLocalPragma.h>
template< class T, class E>
Je suppose que T serait toujours un type entier, et E un enum.
Donc...class CSizedEnum
{
private:
T xValue;
public:
inline
CSizedEnum( void)
{
xValue = 0; /* Generally invalid until assigned */
};
inline
CSizedEnum( E const & rkeSource)
Ne serait-il pas préferable (ou au moins plus habituel) de
passer le paramètre par valeur ?
Google publie en Quoted-Printable ; c'est ça qu'OE refuse de citer.
Est-ce Google qui le fait ? Parce que j'avais l'impression que
ça ne touche pas les posting que je fais de chez moi, également
à travers Google.
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Pour bien répondre avec Google, ne pas cliquer
-'(__) « Répondre », mais « Afficher les options »,
_/___(_) puis cliquer « Répondre » (parmi les options).
C'est périmer, je crois. Il l'ont réparer, et le bouton
« Répondre » a l'air de fonctionner correctement maintenant.
Google publie en Quoted-Printable ; c'est ça qu'OE refuse de citer.
Est-ce Google qui le fait ? Parce que j'avais l'impression que
ça ne touche pas les posting que je fais de chez moi, également
à travers Google.
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Pour bien répondre avec Google, ne pas cliquer
-'(__) « Répondre », mais « Afficher les options »,
_/___(_) puis cliquer « Répondre » (parmi les options).
C'est périmer, je crois. Il l'ont réparer, et le bouton
« Répondre » a l'air de fonctionner correctement maintenant.
Google publie en Quoted-Printable ; c'est ça qu'OE refuse de citer.
Est-ce Google qui le fait ? Parce que j'avais l'impression que
ça ne touche pas les posting que je fais de chez moi, également
à travers Google.
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Pour bien répondre avec Google, ne pas cliquer
-'(__) « Répondre », mais « Afficher les options »,
_/___(_) puis cliquer « Répondre » (parmi les options).
C'est périmer, je crois. Il l'ont réparer, et le bouton
« Répondre » a l'air de fonctionner correctement maintenant.