c++에서 매개 변수 대상 과 국부 대상 의 분석 순서 에 대한 상세 한 해석

다음은 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

위의 코드 를 통 해 알 수 있 듯 이 매개 변수 대상 과 부분 대상 은 모두 함수 가 종료 되 기 전에 석조 함 수 를 호출 합 니 다.또한 매개 변수 대상 은 부분 대상 에서 석조 함 수 를 호출 한 후에 자신의 석조 함 수 를 호출 합 니 다.

좋은 웹페이지 즐겨찾기