c++에서 매개 변수 대상 과 국부 대상 의 분석 순서 에 대한 상세 한 해석
class X {
public:
int i;
int j;
~X() {}
};
void f(X x) {
X x1;
x.i = 1;
x.j = 2;
}
int main() {
f(X());
}
다음은 main 함수 의 외환 코드 입 니 다.
_main PROC
; 15 : int main() {
push ebp
mov ebp, esp
sub esp, 8; 8byte , ,
; ,
; 16 : f(X());
mov eax, DWORD PTR $T2560[ebp+4]; 4byte eax, j eax
push eax; eax
mov ecx, DWORD PTR $T2560[ebp]; ecx, i ecx
push ecx; ecx
; , f
call ?f@@YAXVX@@@Z ; f
add esp, 8; 8byte,
lea ecx, DWORD PTR $T2560[ebp]; ecx
call ??1X@@QAE@XZ ;
; 17 : }
xor eax, eax
mov esp, ebp
pop ebp
ret 0
_main ENDP
위 에서 알 수 있 듯 이 발생 하 는 임시 대상 은 함수 호출 이 끝 난 후에 야 분석 함 수 를 호출 합 니 다.다음은 f 함수 의 외환 인 코딩 입 니 다.
?f@@YAXVX@@@Z PROC ; f
; 9 : void f(X x) {
push ebp
mov ebp, esp
sub esp, 8; x1 8byte
; 10 : X x1;
; 11 : x.i = 1;
mov DWORD PTR _x$[ebp], 1; 1 , 1 i
; 12 : x.j = 2;
mov DWORD PTR _x$[ebp+4], 2; 2 4byte , 2 j
; 13 :
; 14 : }
lea ecx, DWORD PTR _x1$[ebp]; x1 ecx
call ??1X@@QAE@XZ ; x1
lea ecx, DWORD PTR _x$[ebp]; ecx
call ??1X@@QAE@XZ ;
mov esp, ebp
pop ebp
ret 0
?f@@YAXVX@@@Z ENDP ; f
; Function compile flags: /Odtp
_TEXT ENDS
; COMDAT ??1X@@QAE@XZ
_TEXT SEGMENT
_this$ = -4 ; size = 4
??1X@@QAE@XZ PROC ; X::~X, COMDAT
; _this$ = ecx
; 6 : ~X() {}
push ebp
mov ebp, esp
push ecx
mov DWORD PTR _this$[ebp], ecx
mov esp, ebp
pop ebp
ret 0
??1X@@QAE@XZ ENDP
위의 코드 를 통 해 알 수 있 듯 이 매개 변수 대상 과 부분 대상 은 모두 함수 가 종료 되 기 전에 석조 함 수 를 호출 합 니 다.또한 매개 변수 대상 은 부분 대상 에서 석조 함 수 를 호출 한 후에 자신의 석조 함 수 를 호출 합 니 다.