16

パフォーマンス上の理由からラムダ式は非常に短いため、インライン化したいと思います。出来ますか?

4

6 に答える 6

22

このinlineキーワードは、実際には関数をインライン化しません。最近のコンパイラは、インライン化に関して、あなたよりも優れた決定を下すでしょう。

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

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

于 2010-07-22T13:51:57.243 に答える
14

可能であれば、コンパイラはそれをインライン化します。たとえば、-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
于 2010-07-22T14:18:09.243 に答える
9

ラムダ式がインライン化される可能性があります。内部的には、ラムダ式は他の関数オブジェクトと何ら変わりはありません。

特定のラムダ式がインライン化されるかどうかは、コンパイラーと、インライン化する価値があるとコンパイラーが判断するかどうかに完全に依存します。

于 2010-07-22T13:52:46.243 に答える
3

通常の構造体ファンクターがある場合、コンパイラーはほぼ確実にそれをインライン化します。C ++ 0xスタイルのラムダがある場合、コンパイラーはほぼ確実にそれをインライン化します。boost :: lambdaを使用している場合は、シーンの下でラムダがどのように機能するかに応じて、それが機能する可能性があります。短いバージョン:インライン化または非インライン化を保証することはできませんが、コンパイラーを信頼し、疑わしい場合は、インライン化を簡単かつ簡単にする必要があります。

于 2010-07-22T13:53:52.120 に答える
1

私は決してそれらの多くからの出力を見たことはありませんが、これまでのところ、私が見た出力はすべてインライン化されています。

于 2010-07-22T13:56:53.177 に答える
0

C++1x のラムダは、内部的には通常の関数オブジェクトを生成します。これらはコンパイラによってインライン化できます。

あなたが行った測定結果は、コンパイラがインライン展開を行っていないことを示唆していましたか?

于 2010-07-22T14:08:15.187 に答える