質問

閉じられた昨年

パフォーマンスの理由では非常に短いため、ラムダ表現をインライン化したいです。それは可能ですか?

役に立ちましたか?

解決

inlineキーワードは実際には関数をインライン化させることはありません。最近のコンパイラは、あなたが意志よりもインライン化に関してより良い決定を下すつもりです。

短いλの場合、関数はおそらくインライン化されます。

ラムダでinlineキーワードを使用しようとしている場合は、答えはいいえ、それを使うことはできません。

他のヒント

コンパイラができる場合はインラインになります。例えば、-O2、

のG ++ 4.5では
#include <vector>
#include <algorithm>

int main () {
    std::vector<int> a(10);
    for (int i = 0; i < 10; ++ i) a[i] = i;

    asm ("Ltransform_begin: nop; nop; nop; nop; nop; nop; ");
    std::transform(a.begin(), a.end(), a.begin(), [] (int x) { return 2*x; });
    asm ("Lforeach_begin: nop; nop; nop; nop; nop; nop; ");
    std::for_each(a.begin(), a.end(), [] (int x) { printf("%d\n", x); });
    asm ("Lforeach_done: nop; nop; nop; nop; nop; nop; ");

    return 0;
}
.

は、2*xprintfλが完全にインラインされているアセンブリを生成します。

# 9 "x.cpp" 1
    Ltransform_begin: nop; nop; nop; nop; nop; nop; 
# 0 "" 2
    .align 4,0x90
L13:
    sall    (%rax)
    addq    $4, %rax
    cmpq    %rax, %r12
    jne L13
# 13 "x.cpp" 1
    Lforeach_begin: nop; nop; nop; nop; nop; nop; 
# 0 "" 2
    .align 4,0x90
L14:
    movl    (%rbx), %esi
    leaq    LC0(%rip), %rdi
    xorl    %eax, %eax
LEHB1:
    call    _printf
LEHE1:
    addq    $4, %rbx
    cmpq    %r12, %rbx
    jne L14
# 17 "x.cpp" 1
    Lforeach_done: nop; nop; nop; nop; nop; nop; 
# 0 "" 2
.

ラムダ表現がインライン化される可能性があります。フードの下では、ラムダ式は他の関数オブジェクトとは異なりません。

特定のラムダ式がインライン化されているかどうかは、コンパイラに完全に依存し、それがインライン化する価値があるかどうかを決定するかどうか。

通常の構造のファンクタを持っている場合、コンパイラはほぼ確実にそれをインラインにします。C ++ 0xスタイルのラムダがある場合、コンパイラはほぼ確実にそれをインラインにします。Boost :: Lambdaを使用している場合は、ラムダがシーンの下にどのように機能するかによって、それができるかもしれません。ショートバージョン:あなたはそれがインライン化または非インラインではないことを保証することはできませんが、あなたはあなたのコンパイラを信頼し、疑問がある場合は簡単で簡単にインラインで簡単にしてください。

私はそれらの ot> からの出力を任意の手段で見ていませんが、私はそれらのすべてがインライン化されている。

C ++ 1x 'Lambdasは、フードの下で、通常の関数オブジェクトを生成します。それらはコンパイラによってインライン化され得る。

あなたが作った測定値は、これが注目に値するパフォーマンスの損失につながる場所にコンパイラがそれらをインラインしなかったことを示唆しましたか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top