0

Tインスタンス化されたものに応じて異なる動作を与えるために、テンプレート パラメーターによってパラメーター化された関数テンプレートTがあります。必要な特定のバリエーションは非常に単純T::foo(some_args)です。状態が関与しないため、静的関数の呼び出しで十分です。

fooただし、それを関数テンプレートの本文に表示したくありません。

T(some_args);構文上のノイズを避けるために呼び出したいと思います。関数呼び出し演算子()を静的であると宣言することは不可能だと思います(またはそうですか?)。T状態がないため、インスタンス固有の変数はありません。

上記が不可能な場合、インライン化/最適化される可能性が高いもの (G++、Clang、ICC)

T::foo(some_args); // foo being a static function

また

T()(some_args);  // operator () declared inline

出力を確認するためのアセンブリを知りません。質問は、実際のパフォーマンスよりも学術的/好奇心の観点からのものです。

T()(some_args)実行時にオブジェクトを本当に割り当てますか? または、通常は最適化されていますか?

4

1 に答える 1

3

Simple example:

struct T
{
    int operator()(int i) const {
        return i+1;
    }   
};

int main()
{
    return T()(1);
}

Compiled with -O2 this will yield:

(gdb) disassemble main
Dump of assembler code for function main():
   0x0000000000400400 <+0>:     mov    eax,0x2
   0x0000000000400405 <+5>:     ret
End of assembler dump.

Even with -O0 this will not create a temporary in case you use the implicit default constructor in T:

(gdb) disassemble main
Dump of assembler code for function main():
   0x00000000004004ec <+0>:     push   rbp
   0x00000000004004ed <+1>:     mov    rbp,rsp
   0x00000000004004f0 <+4>:     sub    rsp,0x10
   0x00000000004004f4 <+8>:     lea    rax,[rbp-0x1]
   0x00000000004004f8 <+12>:    mov    esi,0x1
   0x00000000004004fd <+17>:    mov    rdi,rax
   0x0000000000400500 <+20>:    call   0x400508 <T::operator()(int) const>
   0x0000000000400505 <+25>:    leave
   0x0000000000400506 <+26>:    ret
End of assembler dump.
于 2013-02-11T09:18:54.057 に答える