2017-04-25 7 views
1

私が読んだことが、次の質問:スタティックテンプレートファンクタはコンパイラによってインライン展開できますか?

  1. Template functors vs functions
  2. C++ Functors - and their uses
  3. C++ function template partial specialization?

そして私はC++ functorsが適していますかを理解。

template <typename T, unsigned int state> 
class Foo { 
public: 
    static Foo_func() { /* Do something */ }; 
} 

// Partial specialization: 
// -- state == 1 
template <typename T> 
class Foo <T, 1> { 
public: 
    static Foo_func() { /* Do something */ }; 
} 

template <typename F> 
void call_func(F func) { 

    // Do something... // 

    func(); 

    // Do something... // 
} 

int main() { 
    Foo <double, /*state*/ 1> obj; 

    // Case 1: 
    call_func(obj.Foo_func); 

    // Case 2: 
    call_func(Foo<double, /*state*/ 1>::Foo_func); 
} 

たシナリオコンパイラでFoo_func()をインライン化することができるようになります。しかし、私は次の操作を行います場合はどうなるか推測することはできませんか?

+1

アセンブリを見て、コンパイラの動作を確認します。よく使うリソースはhttps://gcc.godbolt.org/ – NathanOliver

+0

です。あなたのコードは多くの理由でコンパイルされません。それが価値あるものであれば、コンパイラは 'func'への呼び出しをインライン化できるはずですが、' call_func'自体がインライン化されている場合にのみそうなるでしょう。 [この単純なコードでは、コンパイラはすべてをインライン展開する](https://godbolt.org/g/8KmlTv)。 – Cornstalks

+1

一般的には、確実に最適化を推論することはできません。常にasmを確認してください。 FWIW ClangとGCCは両方ともこの場合インラインになっていますが、必ずしもそうではないかもしれません。 – harold

答えて

4

しかし、私はすることが可能ではありません、以下

を行います場合はどうなるかを推測何が起こるかを推測することはできませんが、あなたはそれを試してみて、参照する必要があります。

インライン展開は最適化であり、言語機能ではありません。それが起こるかどうかは、あなたのコンパイラ、そのバージョン、それを設定する方法、そして可能であればインライン展開されたコールサイトの周りの多くのコンテキストに依存します。

関連する問題