1
私が読んだことが、次の質問:スタティックテンプレートファンクタはコンパイラによってインライン展開できますか?
- Template functors vs functions
- C++ Functors - and their uses
- 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()
をインライン化することができるようになります。しかし、私は次の操作を行います場合はどうなるか推測することはできませんか?
アセンブリを見て、コンパイラの動作を確認します。よく使うリソースはhttps://gcc.godbolt.org/ – NathanOliver
です。あなたのコードは多くの理由でコンパイルされません。それが価値あるものであれば、コンパイラは 'func'への呼び出しをインライン化できるはずですが、' call_func'自体がインライン化されている場合にのみそうなるでしょう。 [この単純なコードでは、コンパイラはすべてをインライン展開する](https://godbolt.org/g/8KmlTv)。 – Cornstalks
一般的には、確実に最適化を推論することはできません。常にasmを確認してください。 FWIW ClangとGCCは両方ともこの場合インラインになっていますが、必ずしもそうではないかもしれません。 – harold