Funkcje inline, Szablony klas i MVC++

0

Witam !

Sprawa wygląda tak:
Mam szablon klasy wektor (w sensie matematycznym) dowolnego wymiaru i typu i jest fajnie.
Cala jego implementacja opiera się na rekurencyjnym wywoływaniu funkcji inline z innego szablonu klasy i też jest fajnie. Natomiast problem polega na tym, że funkcje wcale nie są rozwijane tylko normalnie wywoływane (dosłownie wszystkie) za pomocą call [???] . Taki stan rzeczy całkowicie eliminuje sens stosowania (poza tym) szablonów wyrażeń. Chodzi tu w całości o względy szybkości działania tych funkcji. Po przeszukania dok i innych takich na temat kompilatora nic na ten temat nie znalazłem. Część kodu wygląda mniej więcej tak:
PS: Całość była kompilowana w Microsoft Visual C++ 6.0

template<class VEC_T, class VEC_TT, int VEC_DIM> struct vector_impl{
    template<int COUNT> struct setv{
      static inline run(VEC_T& vec, const VEC_TT& val){
        vec[COUNT] = val;
        setv<COUNT-1>::run(vec, val);
      }
    };

    template<> struct setv<-1>{
      static inline run(VEC_T& vec, const VEC_TT& val){}
    };
  };

  template<class T, int DIM> class vector{
      T m[DIM];

      typedef vector_impl<vector<T, DIM>, T, DIM> impl;
    public:
      T& operator[](int lp){
        return m[lp];
      }

      const T& operator[](int lp) const{
        return m[lp];
      }
      
      void setv(const T& val){
        impl::setv<DIM-1>::run(*this, val);
      }
  };

Za wszelkie uwagi i pomoc z góry dziękuje !</url>

0

Kompilator w trybie debug nie musi rozwijać funkcji inline.

0

Funkcji inline sie nie wywołuje, po prostu zamiast wywołania (call) kompilator wrzuca treść funkcji. Tak więc pojęcie rekurencji traci sens w tym świetle. Wewnątrz funkcji inline nie może sie znaleźć jeszcze jedna funkcja inline, a zwłaszcza rekurencja bo rozmiar funkcji urósłby do nieskończoności.

0
  1. Nie jest to tryb Debug tylko Release
  2. Funkcje inline mogą być wywoływane rekurencyjnie. Można się o tym przekonać na 2 sposoby.
    Po pierwsze (jeżeli chodzi o sam język: książka Brucea Eckela i Chucka Allisonaa Thinking in C++ Tom 2 rozdział o Szablonach jest wspomniane wprost o takim wywoływania w celu minimalizacji narzutu związanego z przetwarzaniem pętli i sama technika Szablonów Wyrażeń. Po drugie po co kompilatory (nie wszystkie) miały by opcje ustawiające maksymalną liczę zagnieżdżonych funkcji inline) lub nawet
#pragma inline_depth( 255 )
#pragma inline_recursion( on )
0

A i wywołania rekurencyjne (w tym przypadku) są zatrzymywane pełną jawną specjalizacją vector_impl dla COUNT == -1. Chodzi o to żeby tym wszystkim zajął się kompilator.

0

Kompilator sam decyduje czy funkcja ma byc funkcją inline czy nie. Zależy to od jej wielkosci, złożoności. Deklarując funkcje jako inline dajesz tylko wskazówkę kompilatorowi.

1 użytkowników online, w tym zalogowanych: 0, gości: 1