1

私の目標は、含まれているすべての update() メソッドを最小限のオーバーヘッドで連続して呼び出すことができるメソッド void update() を持つすべてのクラスで構成されるタプルを含むクラスを作成することです。これが私のコードです:

template< typename... Tel >
class ExecSet
{
private:
  std::tuple<Tel...> m_data;

   //Compile-time Recursive
   template<int _iter, typename _Head, typename... _Tail>
   inline void _update()
   {
     std::get<_iter>(m_data).update();
     _update< _iter + 1, _Tail... >();
   }

   //Base case
   template<int _iter>
   inline void _update()
   {
     //Do nothing here
   }

public:
   inline void update()
   {
     _update<0, Tel...>();
   }
};

class Foo
{
//..
inline void update()
  {
    std::cout << "An update of Foo " << m_i << "\n";
  }

  private:
  int m_i;
};

class Bar
{
//..
inline void update()
  {
    std::cout << "An update of Bar " << m_i << "\n";
  }

  private:
  int m_i;
};

コードがコンパイルされ、テストが期待どおりに実行されます。私の質問は、ExecSet::update() が内部で行われるすべての再帰呼び出しとともに完全にインライン化されることを 100% 確信できるでしょうか? これはすべてコンパイル時に決定されるため、そうすべきだと思います。そして -O3 の下では、すべてがインライン化されているはずですよね?

4

2 に答える 2

1

マシン コードの代わりにシンボリック アセンブリを発行するようにコンパイラに依頼し、自分で確認することができます。そうは言っても、私自身何度もそれを行ってきたので、真面目なコンパイラーがインライン化するためのこのようなありふれた機会を未使用のままにしておくことはないと確信しています。現代のコンパイラが行うことは、純粋な魔法です。

于 2013-07-20T19:51:33.703 に答える