??????c++?У???????????麯???????????????????????????????????????????vptr????????????????????衣

???????????????vptr???

??????????c++???

class X {
private:
    int i;
public:
    X(int ii) {
        i = ii;
    }
    virtual void set(int ii) {//?麯??
        i = ii;
    }
};

 


int main() {
   X x(1);
}

??????????????main?????????

_main    PROC

; 16   : int main() {

    push    ebp
    mov    ebp?? esp
    sub    esp?? 8;?????x???8byte??? vptr????4??? ???????i?4byte

; 17   :    X x(1);

    push    1;//??1??????????????????????
    lea    ecx?? DWORD PTR _x$[ebp];//???x??????????this?????????????????????????
    call   ??0X@@QAE@H@Z                ; ?x???ù?????

; 18   : }

    xor    eax?? eax
    mov    esp?? ebp
    pop    ebp
    ret    0
_main    ENDP

????????????????????????X?????麯????main??????????????x?????8byte???????????vptr??????????i??

??????????x?????????????

??0X@@QAE@H@Z PROC                    ; X::X?? COMDAT
; _this$ = ecx

; 5    :     X(int ii) {

    push    ebp
    mov    ebp?? esp
    push    ecx;??ecx???????????this???(x????????)???4byte????
    mov    DWORD PTR _this$[ebp]?? ecx;??this???洢????????????? ecx????????x??????
    mov    eax?? DWORD PTR _this$[ebp];??x?????????????eax
    mov    DWORD PTR [eax]?? OFFSET ??_7X@@6B@;????_7X@@6B@???????(??vtable??????)???x???????????????洢 ??????????vptr???

; 6    :         i = ii;

    mov    ecx?? DWORD PTR _this$[ebp];??x??????ecx
    mov    edx?? DWORD PTR _ii$[ebp];??????ii??????????edx
    mov    DWORD PTR [ecx+4]?? edx;???????eax???д?????x????4byte??????棬????x????????i???

; 7    :     }

    mov    eax?? DWORD PTR _this$[ebp];??x???????????????eax????????????????????????????????
    mov    esp?? ebp
    pop    ebp
    ret    4
??0X@@QAE@H@Z ENDP

??????????п?????????????????????в????????????vtable???????????vptr???????vptr???λ?????????????