c++에서 임시 대상 의 분석 시기 에 대한 상세 한 설명

c++에서 임시 대상 이 필요 하지 않 으 면 석조 함 수 를 호출 하여 차지 하 는 자원 을 방출 합 니 다.반면 서명 대상 은 생 성 순서 와 달리 분석 함 수 를 순서대로 호출 합 니 다.
c++소스 코드:

class X  {
public:
   int i;
   int j;
   ~X() {}
   X() {}

};

int main() {
    X x1;
    X();
    x1.i = 1;
    X x2;

   
}

대응 하 는 외환 코드:

_main    PROC

; 11   : int main() {

    push    ebp
    mov    ebp, esp
    sub    esp, 24                    ; x1 x2 24byte

; 12   :     X x1;

    lea    ecx, DWORD PTR _x1$[ebp]; x1 ,
    call    ??0X@@QAE@XZ                ; x1

; 13   :     X();

    lea    ecx, DWORD PTR $T2559[ebp]; ,
    call    ??0X@@QAE@XZ                ;
    lea    ecx, DWORD PTR $T2559[ebp]; ,
    call    ??1X@@QAE@XZ                ;

; 14   :     x1.i = 1;

    mov    DWORD PTR _x1$[ebp], 1; 1 x1 , 1 x1 i

; 15   :     X x2;

    lea    ecx, DWORD PTR _x2$[ebp]; x2 ,
    call    ??0X@@QAE@XZ                ; x2

; 16   :    
; 17   :    
; 18   : }

    lea    ecx, DWORD PTR _x2$[ebp]; x2 ,
    call    ??1X@@QAE@XZ                ; x2
    lea    ecx, DWORD PTR _x1$[ebp]; x1 ,
    call    ??1X@@QAE@XZ                ; x1
    xor    eax, eax
    mov    esp, ebp
    pop    ebp
    ret    0
_main    ENDP

위의 외환 코드 를 통 해 알 수 있 듯 이 임시 대상 은 필요 하지 않 은 후에 분석 함 수 를 호출 했다.비록 x2 대상 전에 만 들 어 졌 지만 x2 대상 전에 분석 되 었 다.반면 x1 x2 분석 함수 호출 순 서 는 구조 함수 호출 순서 와 반대 된다.
다음 상황 을 살 펴 보 자.
c++의 원본 코드:

class X  {
public:
  int i;
  int j;
  int k;
  X() {}
  ~X() {}
};


int main() {
    X x1;
    X(), x1.i = 1;//
    X x2;
}

임시 대상 을 개조 한 후 분점 이 아 닌 쉼표 표현 식 이 있 습 니 다.
다음은 외환 코드 입 니 다.

; 12   : int main() {

    push    ebp
    mov    ebp, esp
    sub    esp, 36                    ; x1 x2 36

; 13   :     X x1;

    lea    ecx, DWORD PTR _x1$[ebp]; x1 ,
    call    ??0X@@QAE@XZ                ; x1

; 14   :     X(), x1.i = 1;//

    lea    ecx, DWORD PTR $T2560[ebp]; ,
    call    ??0X@@QAE@XZ                ;
    mov    DWORD PTR _x1$[ebp], 1; 1 x1 , x1 i 1
    lea    ecx, DWORD PTR $T2560[ebp]; ,
    call    ??1X@@QAE@XZ                ;

; 15   :     X x2;

    lea    ecx, DWORD PTR _x2$[ebp]; x2 ,
    call    ??0X@@QAE@XZ                ; x2

; 16   : }

    lea    ecx, DWORD PTR _x2$[ebp]; x2 ,
    call    ??1X@@QAE@XZ                ; x2
    lea    ecx, DWORD PTR _x1$[ebp]; x1 ,
    call    ??1X@@QAE@XZ                ; x1
    xor    eax, eax
    mov    esp, ebp
    pop    ebp
    ret    0
_main    ENDP

첫 번 째 와 달리 임시 대상 구조 가 끝 난 후에 석조 함 수 를 즉시 호출 하지 않 고 쉼표 뒤의 할당 문 구 를 실행 한 후에 야 호출 된 석조 함수 입 니 다.
위 에서 말 한 바 와 같이:
임시 대상 이 석조 함 수 를 호출 하 는 시 기 는 고급 언어 가 실 행 될 때 이 고,고급 언어 가 실 행 된 표 지 는 분점 이다.따라서 임시 대상 이 석조 함 수 를 호출 할 때 는 분점 에 부 딪 혔 을 때 이다.

좋은 웹페이지 즐겨찾기