????c++?е???
???????????? ???????[ 2013/5/31 10:37:22 ] ????????
??????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???λ?????????????
??????
![](/images/ad-banner/ad-banner.png)
???·???
??????????????????
2023/3/23 14:23:39???д?ò??????????
2023/3/22 16:17:39????????????????????Щ??
2022/6/14 16:14:27??????????????????????????
2021/10/18 15:37:44???????????????
2021/9/17 15:19:29???·???????·
2021/9/14 15:42:25?????????????
2021/5/28 17:25:47??????APP??????????
2021/5/8 17:01:11