2010-07-22 5 views

Antwort

15

Das Schlüsselwort inline bewirkt nicht, dass Funktionen tatsächlich inline sind. Jeder neuere Compiler wird in Bezug auf Inlining bessere Entscheidungen treffen als Sie.

Bei einem kurzen Lambda wird die Funktion wahrscheinlich inline sein.

Wenn Sie versuchen, das inline Schlüsselwort mit einem Lambda zu verwenden, ist die Antwort nein, das können Sie nicht verwenden.

+3

Es ist trivial einfach, Gegenbeispiele für die Behauptung zu finden, dass ein neuer Compiler bessere Entscheidungen über das In-Lining treffen wird als ein gegebener menschlicher Wille. Ich bin überhaupt kein C-Guru, aber wenn ich einen geschwindigkeitskritischen Code hatte, erzeugt das Markieren einer Methode mit einem Inline-Hinweis oft eine schnellere ausführbare Datei. Alles, was man tun muss, ist den Code zu messen. Ich würde jedem empfehlen, dem gesagt wurde, dass der Compiler besser in der Lage ist, ein Testbett einzurichten, wo er verschiedene Funktionen mit und ohne Inline-Tipps testen kann, wenn man den Compiler austricksen kann. – jackmott

+1

@jack Natürlich. Dafür brauchst du Dinge wie __declspec (forceinline) oder __declspec (noinline). Wenn dies zu einer messbaren Verbesserung führt, 1. brauchst du mehr LTO/LTCG, 2. du brauchst mehr PGO oder 3. Compiler Bugs. Compiler tun nicht alles, was die Leute behaupten, sie tun es die ganze Zeit, aber Inlining ist einer der Bereiche, in denen sie im Allgemeinen wirklich sehr gut sind. –

9

Es ist möglich, dass ein Lambda-Ausdruck inline ist. Unter der Haube unterscheidet sich ein Lambda-Ausdruck nicht von anderen Funktionsobjekten.

Ob ein bestimmter Lambda-Ausdruck inline ist, hängt vollständig vom Compiler ab und ob er entscheidet, lohnt sich.

3

Wenn Sie einen regulären Struktur Funktor haben, wird der Compiler es fast sicher inline. Wenn Sie ein C++ 0x-Stil Lambda haben, wird der Compiler es fast sicher inline. Wenn Sie ein boost :: lambda verwenden, dann könnte es auch funktionieren, abhängig davon, wie das Lambda unter den Szenen funktioniert. Kurze Version: Sie können nicht garantieren, dass es inlining oder nicht inlining ist, aber Sie sollten Ihrem Compiler vertrauen und im Zweifelsfall einfach und einfach inline machen.

1

Ich habe nicht auf die Ausgabe von einem Los von ihnen mit irgendwelchen Mitteln, aber bis jetzt alle von ihnen Ich habe die Ausgabe von inline angesehen worden.

0

C++ 1x 'lambdas erzeugt unter der Haube normale Funktionsobjekte. Diese können vom Compiler eingezeichnet werden.

Haben die von Ihnen durchgeführten Messungen ergeben, dass der Compiler sie nicht an einer Stelle inline eingefügt hat, an der dies zu einem bemerkenswerten Leistungsverlust führt?

+1

Nitpick: Keine Arbeit an C++ 1x hat noch begonnen, und es ist nichts weiter als eine begründete Vermutung, dass es sogar ein C++ 1x geben wird. Das Komitee arbeitet immer noch an C++ 0x, und es ist nicht wahrscheinlich, dass der Arbeitstitel geändert wird, nur weil er nicht mit dem endgültigen Kurztitel des Standards übereinstimmt. –

+0

@Christopher: Ich stimme nicht zu. Es ist wahrscheinlich, dass der nächste C++ - Standard C++ 11 sein wird, es könnte C++ 12 werden, es ist unwahrscheinlich, dass es C++ 10 wird, und es ist unmöglich, C++ 09 zu werden. Da die letzte (und nur die letzte) Ziffer unsicher ist, wird sie üblicherweise durch ein "x" ersetzt. Ob es lambdas haben wird, ist sicherlich nicht garantiert (sieh dir nur die konzepte an), aber es ist sehr unwahrscheinlich, dass sich das Komitee mit weniger zufrieden geben würde. – sbi

+0

Der Witz ist, dass die 0x Hex jetzt ist, da die meisten Leute weiterhin C++ 0x verwenden – ZachS

12

Der Compiler wird es inline, wenn es möglich ist. Zum Beispiel wird in g ++ 4.5 mit -O2,

#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; 
} 

erzeugt die Montage, dass die und printf Lambdas vollständig inlined sind.

# 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 
Verwandte Themen