template , methode virtuelle et inline

template , methode virtuelle et inline - C++ - Programmation

Marsh Posté le 04-11-2003 à 09:03:09    

Peut t on inliner une fonction virtuelle ?
Le fait qu'elle fasse partie d'un classe tempate change t il quelquechose ?
-O3 forcera t il cet inlining ??
 
un exemple :
 

Code :
  1. #include <iostream>
  2. struct term
  3. {
  4.   virtual inline int getNode() {return 0;}
  5. };
  6. struct plus
  7. {
  8.    static inline int apply(int x, int y) { return x+y; }
  9. };
  10. class leaf : public term
  11. {
  12.     public:
  13.     leaf( int v) : val(v) {}
  14.     virtual int inline getNode() { return val; }
  15.     private :
  16.     int val; 
  17. };
  18. template<class X,class O> class unary_term : public term
  19. {
  20.     public:
  21.     unary_term( X node) : node_(node) {}
  22.     virtual int inline getNode() { return O::apply(node_.getNode()); }
  23.     private :
  24.     X node_; 
  25. };
  26. template<class X,class Y,class O> class binary_term : public term
  27. {
  28.     public:
  29.     binary_term( X nodex, Y nodey ) : node_x(nodex),node_y(nodey) {}
  30.     virtual int inline getNode()
  31.     { return O::apply(node_x.getNode(),node_y.getNode()); }
  32.     private :
  33.     X node_x;
  34.     Y node_y;
  35. };
  36. template<class X> class expression : public term
  37. {
  38.     public:
  39.     expression( X xpr ) : expr_(xpr) {}
  40.     virtual int inline getNode() { return expr_.getNode(); }
  41.     private :
  42.     X  expr_;
  43. };
  44. class function
  45. {
  46.     public:
  47.    
  48.     template<class X>
  49.     function& operator=( expression<X> t ) { expr_ = &t; return *this; }
  50.    
  51.     inline int operator()()  { return expr_->getNode(); }
  52.     private :
  53.     term*  expr_;
  54. };
  55. class val : public term
  56. {
  57.    public:
  58.    val( int v) : v_(v) {}
  59.    virtual int inline getNode()  { return v_; }
  60.    private:
  61.    int v_;
  62. };
  63. inline expression<binary_term<leaf,leaf,plus> > operator+( val a, val b )
  64. {
  65.   return expression<binary_term<leaf,leaf,plus> >(binary_term<leaf,leaf,plus>(leaf(a.getNode()),leaf(b.getNode())));
  66. }
  67. int main (int argc, const char * argv[])
  68. {
  69.    function func;
  70.    func = val(3) + val(2);
  71.  
  72.    std::cout << func() << std::endl;
  73. }


 
Les appels de getNode() seront inliné corretement ou vont-ils pourrir mon code avec des appels de fonctions :sweat: (dsl mais le -s de mon gcc fait n'imp. je peut pas verifier) ???

Reply

Marsh Posté le 04-11-2003 à 09:03:09   

Reply

Marsh Posté le 04-11-2003 à 09:05:14    

Reply

Marsh Posté le 04-11-2003 à 09:39:55    

Ok, je vois, je vais creuser cette histoire :sweat:

Reply

Marsh Posté le 04-11-2003 à 09:45:28    

Je pense que la règle de faisabilité est simple, il faut qu'au point d'appel de la méthode virtuelle, on conaisse le type exact de l'objet avec certitude. Si on a déjà pas ça, on est obligé de faire de la liaison retardée.
 
Je ne pense pas que les templates entrent en ligne de compte.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 04-11-2003 à 11:00:17    

bref ... ca m'aide pas :(
 
mon probleme reste entier, screugneugneu :-/

Reply

Marsh Posté le 04-11-2003 à 11:02:15    

en C++ y'a des techniques pour éliminer le lien dynamique, par des opérateurs de casting et de la surcharge. Par contre, l'objet tu l'oublies.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 04-11-2003 à 11:07:13    

en fait, c'est à la base que mon problème est mal posé.
 
Comment stocké une classe du type
 
 
template<class X> class expression;
avec X tres tres complexe et innacessible à l'utiliateur dans une classe du type:
 
class function;

Reply

Sujets relatifs:

Leave a Replay

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