Предположим, у меня есть следующий код
void f(PolymorphicType *p)
{
for (int i = 0; i < 1000; ++i)
{
p->virtualMethod(something);
}
}
Будет ли сгенерированный компилятором код разыменовывать запись p
vtable
virtualMethod
1 или 1000 раз? Я использую компилятор Microsoft.
изменить
вот сгенерированная сборка для реального случая, который я рассматриваю. line->addPoint()
- это виртуальный метод беспокойства. У меня нет опыта сборки, поэтому я потихоньку осваиваю...
; 369 : for (int i = 0; i < numPts; ++i)
test ebx, ebx
je SHORT $LN1@RDS_SCANNE
lea edi, DWORD PTR [ecx+32]
npad 2
$LL3@RDS_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 $LL3@RDS_SCANNE
$LN314@RDS_SCANNE:
; 365 : }
p
нет виртуальной таблицы.PolymorphicType
имеет виртуальную таблицу, а*p
имеет указатель на эту виртуальную таблицу. - person Kerrek SB   schedule 07.02.2013p
илиline
автоматическую продолжительность хранения и создается ли когда-либо указатель или ссылка на этот указатель. - person aschepler   schedule 07.02.2013mov edx, DWORD PTR [eax+16]
...call edx
внутри цикла. Я думаю, он каждый раз смотрит на vtable. - person japreiss   schedule 07.02.2013