Joel F Real men use unique_ptr | 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 :
- #include <iostream>
- struct term
- {
- virtual inline int getNode() {return 0;}
- };
- struct plus
- {
- static inline int apply(int x, int y) { return x+y; }
- };
- class leaf : public term
- {
- public:
- leaf( int v) : val(v) {}
- virtual int inline getNode() { return val; }
- private :
- int val;
- };
- template<class X,class O> class unary_term : public term
- {
- public:
- unary_term( X node) : node_(node) {}
- virtual int inline getNode() { return O::apply(node_.getNode()); }
- private :
- X node_;
- };
- template<class X,class Y,class O> class binary_term : public term
- {
- public:
- binary_term( X nodex, Y nodey ) : node_x(nodex),node_y(nodey) {}
- virtual int inline getNode()
- { return O::apply(node_x.getNode(),node_y.getNode()); }
- private :
- X node_x;
- Y node_y;
- };
- template<class X> class expression : public term
- {
- public:
- expression( X xpr ) : expr_(xpr) {}
- virtual int inline getNode() { return expr_.getNode(); }
- private :
- X expr_;
- };
- class function
- {
- public:
-
- template<class X>
- function& operator=( expression<X> t ) { expr_ = &t; return *this; }
-
- inline int operator()() { return expr_->getNode(); }
- private :
- term* expr_;
- };
- class val : public term
- {
- public:
- val( int v) : v_(v) {}
- virtual int inline getNode() { return v_; }
- private:
- int v_;
- };
- inline expression<binary_term<leaf,leaf,plus> > operator+( val a, val b )
- {
- return expression<binary_term<leaf,leaf,plus> >(binary_term<leaf,leaf,plus>(leaf(a.getNode()),leaf(b.getNode())));
- }
- int main (int argc, const char * argv[])
- {
- function func;
- func = val(3) + val(2);
-
- std::cout << func() << std::endl;
- }
|
Les appels de getNode() seront inliné corretement ou vont-ils pourrir mon code avec des appels de fonctions (dsl mais le -s de mon gcc fait n'imp. je peut pas verifier) ??? |