سؤال

أريد تضمين تعبير لامدا لأنه قصير جدًا لسبب الأداء.هل هو ممكن؟

هل كانت مفيدة؟

المحلول

ال 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، تحت غطاء محرك السيارة، تولد كائنات الوظائف العادية.تلك يمكن أن تنبذها المترجم.

قامت بأي قياسات قدمت اقتراح المترجم لم يغددها في مكان حيث يؤدي ذلك إلى فقدان أداء ملحوظ؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top