C++ 编译器可以优化同一指针上的重复虚函数调用吗? [复制]

2024-02-24

假设我有以下代码

void f(PolymorphicType *p)
{
    for (int i = 0; i < 1000; ++i)
    {
        p->virtualMethod(something);
    }
}

编译器生成的代码会取消引用吗p's vtable条目为virtualMethod1次还是1000次?我使用的是微软的编译器。

edit

这是我正在查看的实际案例生成的程序集。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  :        }

一般来说,不,这是不可能的。该功能可能会破坏*this并放置新的从该空间中的同一基础派生的其他对象。

编辑:更简单,功能可以改变p。编译器不可能知道谁有地址p,除非它对于所讨论的优化单元来说是本地的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 编译器可以优化同一指针上的重复虚函数调用吗? [复制] 的相关文章

随机推荐