هل من الممكن تضمين تعبير لامدا؟[ينسخ]
سؤال
أريد تضمين تعبير لامدا لأنه قصير جدًا لسبب الأداء.هل هو ممكن؟
المحلول
ال inline
الكلمة الأساسية لا تتسبب في الواقع في تضمين الوظائف.أي مترجم حديث سوف يتخذ قرارات أفضل فيما يتعلق بالتضمين مما ستفعله.
في حالة وجود لامدا قصيرة، من المحتمل أن تكون الوظيفة مضمنة.
إذا كنت تحاول استخدام inline
الكلمة الرئيسية مع لامدا، الجواب هو لا، لا يمكنك استخدام ذلك.
نصائح أخرى
سيقوم المترجم بتضمينه إذا استطاع.على سبيل المثال، في g++ 4.5 مع -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;
}
ينشئ التجميع الذي 2*x
و printf
لامدا مضمنة بالكامل.
# 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
من الممكن إبزيم تعبير Lambda.تحت غطاء محرك السيارة، لا يختلف تعبير Lambda عن أي كائن آخر وظيفة.
ما إذا كان التعبير LambDA معين يعتمد بالكامل على المحول البرمجي وما إذا كان يقرر أنه يستحق التسليين.
إذا كان لديك وظيفة بنية منتظمة، فسيقوم المحول البرمجي بالتأكيد بضغته.إذا كان لديك Lambda C ++ 0x Lambda، فسيقوم المحول البرمجي بإمكانه بالتأكيد.إذا كنت تستخدم دفعة :: Lambda، فقد تفعل ذلك، اعتمادا على كيفية عمل Lambda أسفل الكواليس.النسخة القصيرة: لا يمكنك ضمان أنها متبقية أو غير متنانة، ولكن يجب أن تثق بمجموعك وإذا كان في شك، اجعلها سهلة وسهلة الأمل.
لم أكن أتطلع إلى الإخراج من الكثير من منها بأي وسيلة، ولكن حتى الآن لقد نظرت جميعهم إلى الإخراج من الإخراج.
c ++ 1x 'lambdas، تحت غطاء محرك السيارة، تولد كائنات الوظائف العادية.تلك يمكن أن تنبذها المترجم.
قامت بأي قياسات قدمت اقتراح المترجم لم يغددها في مكان حيث يؤدي ذلك إلى فقدان أداء ملحوظ؟