假设我有以下代码C++编译器能够在同一个指针上优化重复的虚拟函数调用吗?
void f(PolymorphicType *p)
{
for (int i = 0; i < 1000; ++i)
{
p->virtualMethod(something);
}
}
将编译器生成的代码提领p
的vtable
条目virtualMethod
1或1000倍?我正在使用微软的编译器。
编辑
这里是现实世界的情况下,我在看生成的程序集。 line->addPoint()
是虚拟的关注方法。我没有装配经验,所以我正在慢慢地去...
; 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 : }
要求编译器生成汇编代码并检查。 –
通过优化编译并查看生成的生成代码。 – Petesh
要添加到Joachim的评论 - *除了检查之外没有其他方法*。 –