Class matrix : comprend pas

Class matrix : comprend pas - C++ - Programmation

Marsh Posté le 02-08-2007 à 12:48:13    

Bonjour,
 
J'ai vu ceci dans un code source (simplifié) :

Code :
  1. class CMatrix4
  2. {
  3.         float& operator ()(std::size_t i, std::size_t j)
  4.         {
  5.                 return operator float*()[i + 4 * j];
  6.         }
  7.        const float& operator ()(std::size_t i, std::size_t j) const
  8.        {
  9.               return operator ()(i, j);
  10.        }
  11.         float a11, a21, a31, a41;
  12.         float a12, a22, a32, a42;
  13.         float a13, a23, a33, a43;
  14.         float a14, a24, a34, a44;
  15. };


 
Comment fait-il pour aller récupérer la valeur de "a23" si l'ont fait Matrix(2, 3), je comprend pas dutout le code !
 
Merci d'avance...


Message édité par vincent0 le 02-08-2007 à 12:50:16
Reply

Marsh Posté le 02-08-2007 à 12:48:13   

Reply

Marsh Posté le 02-08-2007 à 12:57:13    

les floats sont les uns à la suite des autres, l'indice du float [i,j] est calculé et passé à l'opérateur [] (qui sors le float qui va bien à partir de l'indice)

Reply

Marsh Posté le 02-08-2007 à 13:02:51    

Merci, Et n'importe quel compilateur nous assure que tous les float seront aligné en mémoire ? Ne vaudrait t-il pas mieux faire un tableau de 4x4 ?

Reply

Marsh Posté le 02-08-2007 à 13:38:50    

Je trouve ça assez porc en fait comme codage, mais je suis loin d'être un expert.
Le code à l'avantage d'être compact et plus rapide qu'une gestion de tableaux. Si c'est une classe critique, la rapidité à sans doute primé devant la facilité de compréhension/la portabilité du code.
Je n'ai jamais vu de compilo ne pas mettre les trucs les uns à la suite des autres en tout cas.

Message cité 2 fois
Message édité par durkheim le 02-08-2007 à 13:39:45
Reply

Marsh Posté le 02-08-2007 à 15:03:20    

Merci,
 
Oui c'est une classe critique, toutes les fonctions membres sont inline et c'est pour une moteur 3d.

Reply

Marsh Posté le 02-08-2007 à 15:42:25    

vincent0 a écrit :

Merci, Et n'importe quel compilateur nous assure que tous les float seront aligné en mémoire ?


 
Il n'y a pas de garantie formelle.  Je ne vois pas de raison pour un compilateur de ne pas le faire.
 

Citation :

Ne vaudrait t-il pas mieux faire un tableau de 4x4 ?


 
Si.

Reply

Marsh Posté le 02-08-2007 à 15:43:15    

durkheim a écrit :

Le code à l'avantage d'être compact et plus rapide qu'une gestion de tableaux.


 
Tu as des mesures?  Je ne vois a priori pas de raison.

Reply

Marsh Posté le 02-08-2007 à 15:47:45    

Je pensais à une gestion de tableaux comme avec des vector, array, et autres "tableaux " (listes si tu préfères).
 
Après, je suis d'accord que pour une déclaration de tableau simple ce n'est pas évident, mais il y a forcément une raison, sinon il n'aurait pas redéfini l'opérateur. Peut être une optimisation du compilo?

Reply

Marsh Posté le 02-08-2007 à 15:48:49    

#
      const float& operator ()(std::size_t i, std::size_t j) const
#
      {
#
             return operator ()(i, j);
#
      }
#
 
 
 
while (1); suffit

Reply

Marsh Posté le 02-08-2007 à 19:22:34    

durkheim a écrit :


Le code à l'avantage d'être compact et plus rapide qu'une gestion de tableaux
.


 
[:aloy] si on est en 1978 oui, de nos jours, un bon vieux float[9] aurais suffit :o
ou std::vector :o

Reply

Marsh Posté le 02-08-2007 à 19:22:34   

Reply

Marsh Posté le 02-08-2007 à 19:26:40    

Joel F a écrit :


si on est en 1978 oui, de nos jours, un bon vieux float[9] aurais suffit :o


 
En C++ en 78?  Tu travaillais avec BS sur C with Classes à ATT?
 
Je doute qu'il y ait jamais eu beaucoup de différences entre le hack ci-dessus, un float[16] et un float[4][4].
 

Citation :

ou std::vector :o


 
Allocation dynamique garantie... voir la différence n'est pas invraisemblable.

Reply

Marsh Posté le 02-08-2007 à 19:30:32    

Taz a écrit :

#
      const float& operator ()(std::size_t i, std::size_t j) const
#
      {
#
             return operator ()(i, j);
#
      }
#
 
 
 
while (1); suffit


 
tiens exact :D

Reply

Marsh Posté le 02-08-2007 à 21:39:20    

Un Programmeur a écrit :


En C++ en 78?  Tu travaillais avec BS sur C with Classes à ATT?


bon :
http://fr.wikipedia.org/wiki/Hyper [...] torique%29
:o
 

Un Programmeur a écrit :


Allocation dynamique garantie... voir la différence n'est pas invraisemblable.


Pour avoir bosser sur ce genre de bench pendant 4 ans ... c'ets assez négligable.
Par contre, le temps d'accés , c'est pas DU TOUT le même ordre de grandeur entre vector et []

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed