Supponiamo che io ho il seguente codiceI compilatori C++ possono ottimizzare le chiamate di funzioni virtuali ripetute sullo stesso puntatore?
void f(PolymorphicType *p)
{
for (int i = 0; i < 1000; ++i)
{
p->virtualMethod(something);
}
}
volontà del compilatore codice generato dereferenziare p
s' vtable
voce per virtualMethod
1 o 1000 volte? Sto usando il compilatore di Microsoft.
modificare
Ecco l'assembly generato per il caso del mondo reale che sto guardando. line->addPoint()
è il metodo di preoccupazione virtuale. Non ho esperienza di assemblaggio, quindi lo sto esaminando lentamente ...
; 369 : for (int i = 0; i < numPts; ++i)
test ebx, ebx
je SHORT [email protected]_SCANNE
lea edi, DWORD PTR [ecx+32]
npad 2
[email protected]_SCANNE:
; 370 : {
; 371 : double *pts = pPoints[i].SystemXYZ;
; 372 : line->addPoint(pts[0], pts[1], pts[2]);
fld QWORD PTR [edi+8]
mov eax, DWORD PTR [esi]
mov edx, DWORD PTR [eax+16]
sub esp, 24 ; 00000018H
fstp QWORD PTR [esp+16]
mov ecx, esi
fld QWORD PTR [edi]
fstp QWORD PTR [esp+8]
fld QWORD PTR [edi-8]
fstp QWORD PTR [esp]
call edx
add edi, 96 ; 00000060H
dec ebx
jne SHORT [email protected]_SCANNE
[email protected]_SCANNE:
; 365 : }
Chiedere al compilatore di generare codice assembler e controllare. –
Compilalo con ottimizzazioni e guarda il codice generato risultante. – Petesh
Per aggiungere al commento di Joachim - * non c'è altro modo * per scoprire altro che controllare. –