Etant donnée la classe Vec (de QGLViewer) résumée ci-dessous
class Vec {
private:
#if defined (UNION_NOT_SUPPORTED)
float x_, y_, z_;
#else
union {
struct { float x_, y_, z_; };
float v_[3];
};
#endif
public:
operator const float*() const {
#ifdef UNION_NOT_SUPPORTED
return &x_;
#else
return v_;
#endif
}
J'ai deux questions :
1) est-ce que tous les compilateurs de toutes les architectures
garantissent que les 3 flottants seront définis en mémoire comme si on
utilisait uniquement le tableau v_ ?
Que se passe-t-il pour les compilateurs/architectures qui ne supportent
pas l'union ?
2) Ma propre classe de vecteur 3D utilise des double plutôt que des
float mais l'affichage openGL se fait naturellement avec des float.
Est-il possible de proposer un mécanisme similaire dans ce cas ? (3
double et un opérateur float*) Je ne vois vraiment pas comment mais dans
le doute...
Etant donnée la classe Vec (de QGLViewer) résumée ci-dessous
class Vec {
private:
#if defined (UNION_NOT_SUPPORTED)
float x_, y_, z_;
#else
union {
struct { float x_, y_, z_; };
float v_[3];
};
#endif
public:
operator const float*() const {
#ifdef UNION_NOT_SUPPORTED
return &x_;
#else
return v_;
#endif
}
J'ai deux questions :
1) est-ce que tous les compilateurs de toutes les architectures
garantissent que les 3 flottants seront définis en mémoire comme si on
utilisait uniquement le tableau v_ ?
Que se passe-t-il pour les compilateurs/architectures qui ne supportent
pas l'union ?
2) Ma propre classe de vecteur 3D utilise des double plutôt que des
float mais l'affichage openGL se fait naturellement avec des float.
Est-il possible de proposer un mécanisme similaire dans ce cas ? (3
double et un opérateur float*) Je ne vois vraiment pas comment mais dans
le doute...
Etant donnée la classe Vec (de QGLViewer) résumée ci-dessous
class Vec {
private:
#if defined (UNION_NOT_SUPPORTED)
float x_, y_, z_;
#else
union {
struct { float x_, y_, z_; };
float v_[3];
};
#endif
public:
operator const float*() const {
#ifdef UNION_NOT_SUPPORTED
return &x_;
#else
return v_;
#endif
}
J'ai deux questions :
1) est-ce que tous les compilateurs de toutes les architectures
garantissent que les 3 flottants seront définis en mémoire comme si on
utilisait uniquement le tableau v_ ?
Que se passe-t-il pour les compilateurs/architectures qui ne supportent
pas l'union ?
2) Ma propre classe de vecteur 3D utilise des double plutôt que des
float mais l'affichage openGL se fait naturellement avec des float.
Est-il possible de proposer un mécanisme similaire dans ce cas ? (3
double et un opérateur float*) Je ne vois vraiment pas comment mais dans
le doute...
Etant donnée la classe Vec (de QGLViewer) résumée ci-dessous dont p os
est une instance, il est semble-t-il possible d'utiliser le code
openGL suivant : glVertex3fv(pos); Transmission d'une seule adresse
pour 3 flottants plutôt que de transmettre les 3 flottants à la suite.
C'est la surcharge de l'opérateur float* qui le permet :
#if defined (Q_OS_IRIX) || defined (Q_OS_AIX) || defined (Q_OS_HPUX)
# define UNION_NOT_SUPPORTED
#endif
// Q_OS_IRIX, Q_OS_AIX et Q_OS_HPUX sont des macros de Qt (trolltech)
class Vec
{
private:
// ...
#if defined (UNION_NOT_SUPPORTED)
float x_, y_, z_;
#else
union
{
struct { float x_, y_, z_; };
float v_[3];
};
#endif
// ...
public:
// ...
operator const float*() const
{
#ifdef UNION_NOT_SUPPORTED
return &x_;
#else
return v_;
#endif
}
// ...
};
J'ai deux questions :
1) est-ce que tous les compilateurs de toutes les
architectures garantissent que les 3 flottants seront définis
en mémoire comme si on utilisait uniquement le tableau v_ ?
Ceci m'étonne avec les possibilités d'alignement différentes
et l'arrivée des architectures 64 bits...
Que se passe-t-il pour les compilateurs/architectures qui ne
supportent pas l'union ?
2) Ma propre classe de vecteur 3D utilise des double plutôt
que des float mais l'affichage openGL se fait naturellement
avec des float. Est-il possible de proposer un mécanisme
similaire dans ce cas ? (3 double et un opérateur float*) Je
ne vois vraiment pas comment mais dans le doute...
Etant donnée la classe Vec (de QGLViewer) résumée ci-dessous dont p os
est une instance, il est semble-t-il possible d'utiliser le code
openGL suivant : glVertex3fv(pos); Transmission d'une seule adresse
pour 3 flottants plutôt que de transmettre les 3 flottants à la suite.
C'est la surcharge de l'opérateur float* qui le permet :
#if defined (Q_OS_IRIX) || defined (Q_OS_AIX) || defined (Q_OS_HPUX)
# define UNION_NOT_SUPPORTED
#endif
// Q_OS_IRIX, Q_OS_AIX et Q_OS_HPUX sont des macros de Qt (trolltech)
class Vec
{
private:
// ...
#if defined (UNION_NOT_SUPPORTED)
float x_, y_, z_;
#else
union
{
struct { float x_, y_, z_; };
float v_[3];
};
#endif
// ...
public:
// ...
operator const float*() const
{
#ifdef UNION_NOT_SUPPORTED
return &x_;
#else
return v_;
#endif
}
// ...
};
J'ai deux questions :
1) est-ce que tous les compilateurs de toutes les
architectures garantissent que les 3 flottants seront définis
en mémoire comme si on utilisait uniquement le tableau v_ ?
Ceci m'étonne avec les possibilités d'alignement différentes
et l'arrivée des architectures 64 bits...
Que se passe-t-il pour les compilateurs/architectures qui ne
supportent pas l'union ?
2) Ma propre classe de vecteur 3D utilise des double plutôt
que des float mais l'affichage openGL se fait naturellement
avec des float. Est-il possible de proposer un mécanisme
similaire dans ce cas ? (3 double et un opérateur float*) Je
ne vois vraiment pas comment mais dans le doute...
Etant donnée la classe Vec (de QGLViewer) résumée ci-dessous dont p os
est une instance, il est semble-t-il possible d'utiliser le code
openGL suivant : glVertex3fv(pos); Transmission d'une seule adresse
pour 3 flottants plutôt que de transmettre les 3 flottants à la suite.
C'est la surcharge de l'opérateur float* qui le permet :
#if defined (Q_OS_IRIX) || defined (Q_OS_AIX) || defined (Q_OS_HPUX)
# define UNION_NOT_SUPPORTED
#endif
// Q_OS_IRIX, Q_OS_AIX et Q_OS_HPUX sont des macros de Qt (trolltech)
class Vec
{
private:
// ...
#if defined (UNION_NOT_SUPPORTED)
float x_, y_, z_;
#else
union
{
struct { float x_, y_, z_; };
float v_[3];
};
#endif
// ...
public:
// ...
operator const float*() const
{
#ifdef UNION_NOT_SUPPORTED
return &x_;
#else
return v_;
#endif
}
// ...
};
J'ai deux questions :
1) est-ce que tous les compilateurs de toutes les
architectures garantissent que les 3 flottants seront définis
en mémoire comme si on utilisait uniquement le tableau v_ ?
Ceci m'étonne avec les possibilités d'alignement différentes
et l'arrivée des architectures 64 bits...
Que se passe-t-il pour les compilateurs/architectures qui ne
supportent pas l'union ?
2) Ma propre classe de vecteur 3D utilise des double plutôt
que des float mais l'affichage openGL se fait naturellement
avec des float. Est-il possible de proposer un mécanisme
similaire dans ce cas ? (3 double et un opérateur float*) Je
ne vois vraiment pas comment mais dans le doute...
beurk !!
class VecDouble {: public Vec} {
private:
double z[3];
mutable float f[3];
public:
operator const float*() const {
f[0] = (float) z[0];
f[1] = (float) z[1];
f[2] = (float) z[2];
return f;
}
operator const double*() const {
return z;
}
};
beurk !!
class VecDouble {: public Vec} {
private:
double z[3];
mutable float f[3];
public:
operator const float*() const {
f[0] = (float) z[0];
f[1] = (float) z[1];
f[2] = (float) z[2];
return f;
}
operator const double*() const {
return z;
}
};
beurk !!
class VecDouble {: public Vec} {
private:
double z[3];
mutable float f[3];
public:
operator const float*() const {
f[0] = (float) z[0];
f[1] = (float) z[1];
f[2] = (float) z[2];
return f;
}
operator const double*() const {
return z;
}
};
2) Ma propre classe de vecteur 3D utilise des double plutôt
que des float mais l'affichage openGL se fait naturellement
avec des float. Est-il possible de proposer un mécanisme
similaire dans ce cas ? (3 double et un opérateur float*) Je
ne vois vraiment pas comment mais dans le doute...
Bien sûr : avec des membres donnés :
double x ;
double y ;
double z ;
float v[ 3 ] ;
Lors de l'appelle à asFloatArray (je déconseilles fortement la
conversion implicite), tu copies les doubles dans le tableau, et
tu renvoies l'adresse du tableau.
2) Ma propre classe de vecteur 3D utilise des double plutôt
que des float mais l'affichage openGL se fait naturellement
avec des float. Est-il possible de proposer un mécanisme
similaire dans ce cas ? (3 double et un opérateur float*) Je
ne vois vraiment pas comment mais dans le doute...
Bien sûr : avec des membres donnés :
double x ;
double y ;
double z ;
float v[ 3 ] ;
Lors de l'appelle à asFloatArray (je déconseilles fortement la
conversion implicite), tu copies les doubles dans le tableau, et
tu renvoies l'adresse du tableau.
2) Ma propre classe de vecteur 3D utilise des double plutôt
que des float mais l'affichage openGL se fait naturellement
avec des float. Est-il possible de proposer un mécanisme
similaire dans ce cas ? (3 double et un opérateur float*) Je
ne vois vraiment pas comment mais dans le doute...
Bien sûr : avec des membres donnés :
double x ;
double y ;
double z ;
float v[ 3 ] ;
Lors de l'appelle à asFloatArray (je déconseilles fortement la
conversion implicite), tu copies les doubles dans le tableau, et
tu renvoies l'adresse du tableau.
beurk !!
C'est ce que je me disais, merci pour la confirmation.
beurk !!
C'est ce que je me disais, merci pour la confirmation.
beurk !!
C'est ce que je me disais, merci pour la confirmation.
beurk !!
C'est ce que je me disais, merci pour la confirmation.
En tant qu'auteur du code incriminé, je suis forcé d'admettre que ce
n'est pas terrible :)
À ma décharge, je n'avais pas pensé aux problème d'alignement, ça
fonctionnait en pratique, et ça permettait un accès direct à x, y et
z que je trouvais plus rapide et concis que v[0], v[1], v[2], ce qui a
de l'importance pour une telle classe de base.
Je vais supprimer l'union et ne garder que le tableau pour être sûr.
beurk !!
C'est ce que je me disais, merci pour la confirmation.
En tant qu'auteur du code incriminé, je suis forcé d'admettre que ce
n'est pas terrible :)
À ma décharge, je n'avais pas pensé aux problème d'alignement, ça
fonctionnait en pratique, et ça permettait un accès direct à x, y et
z que je trouvais plus rapide et concis que v[0], v[1], v[2], ce qui a
de l'importance pour une telle classe de base.
Je vais supprimer l'union et ne garder que le tableau pour être sûr.
beurk !!
C'est ce que je me disais, merci pour la confirmation.
En tant qu'auteur du code incriminé, je suis forcé d'admettre que ce
n'est pas terrible :)
À ma décharge, je n'avais pas pensé aux problème d'alignement, ça
fonctionnait en pratique, et ça permettait un accès direct à x, y et
z que je trouvais plus rapide et concis que v[0], v[1], v[2], ce qui a
de l'importance pour une telle classe de base.
Je vais supprimer l'union et ne garder que le tableau pour être sûr.
Par contre, si j'ai ajouté le cas spécial UNION_NOT_SUPPORTED,
c'est bien que certains compilateurs encore utilisés de nos
jours sur des systèmes historiques hurlent devant tant de
modernité.
Par contre, si j'ai ajouté le cas spécial UNION_NOT_SUPPORTED,
c'est bien que certains compilateurs encore utilisés de nos
jours sur des systèmes historiques hurlent devant tant de
modernité.
Par contre, si j'ai ajouté le cas spécial UNION_NOT_SUPPORTED,
c'est bien que certains compilateurs encore utilisés de nos
jours sur des systèmes historiques hurlent devant tant de
modernité.
Gilles wrote on 29/05/2006 20:54:beurk !!
C'est ce que je me disais, merci pour la confirmation.
En tant qu'auteur du code incriminé, je suis forcé
d'admettre que ce n'est pas terrible :)
disons que cela aurait plus propre avec un pragma align. (mais
cela ne corrige pas tout les dangers d'un union face à un
compilo qui en fait trop).
À ma décharge, je n'avais pas pensé aux problème
d'alignement, ça fonctionnait en pratique, et ça permettait
un accès direct à x, y et z que je trouvais plus rapide et
concis que v[0], v[1], v[2], ce qui a de l'importance pour
une telle classe de base.
si l'essentiel des opérations sont faites par des fonctions
membres de la classe Vec, il sera intéressant en effet de
garder que x,y,z afin d'éviter l'indexage dans ces traitements
internes.
Je vais supprimer l'union et ne garder que le tableau pour
être sûr.
par contre si les coords sont souvent utilisés par d'autres
fonctions sous forme d'un tableau, celui-ci reste
indispensable ...
pourquoi ne pas garder les deux, simplement redéfini selon:
class Vec {
private:
float v[3];
float &x, &y, &z;
public:
Vec() : x(v[0]), y(v[1]), z(v[2]){
x = y = z = 0.0;
}
operator const float*() const {
return v;
}
};
Gilles wrote on 29/05/2006 20:54:
beurk !!
C'est ce que je me disais, merci pour la confirmation.
En tant qu'auteur du code incriminé, je suis forcé
d'admettre que ce n'est pas terrible :)
disons que cela aurait plus propre avec un pragma align. (mais
cela ne corrige pas tout les dangers d'un union face à un
compilo qui en fait trop).
À ma décharge, je n'avais pas pensé aux problème
d'alignement, ça fonctionnait en pratique, et ça permettait
un accès direct à x, y et z que je trouvais plus rapide et
concis que v[0], v[1], v[2], ce qui a de l'importance pour
une telle classe de base.
si l'essentiel des opérations sont faites par des fonctions
membres de la classe Vec, il sera intéressant en effet de
garder que x,y,z afin d'éviter l'indexage dans ces traitements
internes.
Je vais supprimer l'union et ne garder que le tableau pour
être sûr.
par contre si les coords sont souvent utilisés par d'autres
fonctions sous forme d'un tableau, celui-ci reste
indispensable ...
pourquoi ne pas garder les deux, simplement redéfini selon:
class Vec {
private:
float v[3];
float &x, &y, &z;
public:
Vec() : x(v[0]), y(v[1]), z(v[2]){
x = y = z = 0.0;
}
operator const float*() const {
return v;
}
};
Gilles wrote on 29/05/2006 20:54:beurk !!
C'est ce que je me disais, merci pour la confirmation.
En tant qu'auteur du code incriminé, je suis forcé
d'admettre que ce n'est pas terrible :)
disons que cela aurait plus propre avec un pragma align. (mais
cela ne corrige pas tout les dangers d'un union face à un
compilo qui en fait trop).
À ma décharge, je n'avais pas pensé aux problème
d'alignement, ça fonctionnait en pratique, et ça permettait
un accès direct à x, y et z que je trouvais plus rapide et
concis que v[0], v[1], v[2], ce qui a de l'importance pour
une telle classe de base.
si l'essentiel des opérations sont faites par des fonctions
membres de la classe Vec, il sera intéressant en effet de
garder que x,y,z afin d'éviter l'indexage dans ces traitements
internes.
Je vais supprimer l'union et ne garder que le tableau pour
être sûr.
par contre si les coords sont souvent utilisés par d'autres
fonctions sous forme d'un tableau, celui-ci reste
indispensable ...
pourquoi ne pas garder les deux, simplement redéfini selon:
class Vec {
private:
float v[3];
float &x, &y, &z;
public:
Vec() : x(v[0]), y(v[1]), z(v[2]){
x = y = z = 0.0;
}
operator const float*() const {
return v;
}
};
2) Ma propre classe de vecteur 3D utilise des double plutôt
que des float mais l'affichage openGL se fait naturellement
avec des float. Est-il possible de proposer un mécanisme
similaire dans ce cas ? (3 double et un opérateur float*) Je
ne vois vraiment pas comment mais dans le doute...
Bien sûr : avec des membres donnés :
double x ;
double y ;
double z ;
float v[ 3 ] ;
Lors de l'appelle à asFloatArray (je déconseilles fortement la
conversion implicite), tu copies les doubles dans le tableau, et
tu renvoies l'adresse du tableau.
Une dernière petite question : pourquoi déconseilles-tu
fortement la conversion implicite ? Quels sont les
inconvénients/risques ?
2) Ma propre classe de vecteur 3D utilise des double plutôt
que des float mais l'affichage openGL se fait naturellement
avec des float. Est-il possible de proposer un mécanisme
similaire dans ce cas ? (3 double et un opérateur float*) Je
ne vois vraiment pas comment mais dans le doute...
Bien sûr : avec des membres donnés :
double x ;
double y ;
double z ;
float v[ 3 ] ;
Lors de l'appelle à asFloatArray (je déconseilles fortement la
conversion implicite), tu copies les doubles dans le tableau, et
tu renvoies l'adresse du tableau.
Une dernière petite question : pourquoi déconseilles-tu
fortement la conversion implicite ? Quels sont les
inconvénients/risques ?
2) Ma propre classe de vecteur 3D utilise des double plutôt
que des float mais l'affichage openGL se fait naturellement
avec des float. Est-il possible de proposer un mécanisme
similaire dans ce cas ? (3 double et un opérateur float*) Je
ne vois vraiment pas comment mais dans le doute...
Bien sûr : avec des membres donnés :
double x ;
double y ;
double z ;
float v[ 3 ] ;
Lors de l'appelle à asFloatArray (je déconseilles fortement la
conversion implicite), tu copies les doubles dans le tableau, et
tu renvoies l'adresse du tableau.
Une dernière petite question : pourquoi déconseilles-tu
fortement la conversion implicite ? Quels sont les
inconvénients/risques ?
À titre d'exemple : tu n'as pas fourni un opérator << pour ta
classe. Quelqu'un écrit par erreur :
Vec v ;
// ...
std::cout << v << std::endl ;
Avec la conversion implicite, pas de probème -- ça marche. Et
affiche l'adresse du tableau, ce qui n'est certainement pas ce
qu'a voulu l'auteur.
À titre d'exemple : tu n'as pas fourni un opérator << pour ta
classe. Quelqu'un écrit par erreur :
Vec v ;
// ...
std::cout << v << std::endl ;
Avec la conversion implicite, pas de probème -- ça marche. Et
affiche l'adresse du tableau, ce qui n'est certainement pas ce
qu'a voulu l'auteur.
À titre d'exemple : tu n'as pas fourni un opérator << pour ta
classe. Quelqu'un écrit par erreur :
Vec v ;
// ...
std::cout << v << std::endl ;
Avec la conversion implicite, pas de probème -- ça marche. Et
affiche l'adresse du tableau, ce qui n'est certainement pas ce
qu'a voulu l'auteur.