Hirdetés

Új hozzászólás Aktív témák

  • jattila48

    aktív tag

    válasz jattila48 #3186 üzenetére

    A másik programomban teljesen hasonló kódra a VS ezt fordította:

    auto pimpl=hc.pimpl;
    00426AAF mov eax,dword ptr [ebp-1Ch]
    00426AB2 mov ecx,dword ptr [eax]
    00426AB4 mov dword ptr [ebp-28h],ecx
    .
    .
    .
    auto sc=hc.f(1);
    00426ABF push 1
    00426AC1 lea eax,[ebp-74h]
    00426AC4 push eax
    00426AC5 mov ecx,dword ptr [ebp-1Ch]
    00426AC8 call HandleClass::f (04113CFh)
    .
    .
    .
    auto sc2=(pimpl->*hc.mfp)(2);
    00426AD7 mov esi,esp
    00426AD9 push 2
    00426ADB lea eax,[ebp-1D4h]
    00426AE1 push eax
    00426AE2 mov ecx,dword ptr [ebp-28h]
    00426AE5 call dword ptr ds:[42B8A0h]

    Látható, hogy a mfp-én keresztüli hívás előtt nincs befordítva a "fölösleges" kód. Egyébként a kétfajta hívás kódja teljesen hasonló, csak az első call direkt címzéssel, a második pedig indirekt címzéssel történik. Viszont a második call már közvetlenül a BodyClass f tfv.-ét hívja, vagyis valóban nincs forwarding call overhead (ami egyébként elég jelentős). Fórumokon (pl. StackOverflow) azt olvastam, hogy a pimpl-et nem lehet enélkül megcsinálni. Ezek szerint mégis. Ez azért működik, mert az incomplete type-ok member pointerei is forward deklarálhatók.

Új hozzászólás Aktív témák