下面是f函数的汇编码:

?f@@YAXVX@@@ZPROC                    ; 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@XZPROC                    ; 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

  从上面的代码可以看出,参数对象和局部对象都是在函数退出之前调用析构函数。并且参数对象在局部对象调用析构函数之后再调用自己的析构函数。