关闭

从汇编看c++初始化列表初始化成员变量

发表于:2013-6-27 13:29

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:chaoguo1234    来源:51Testing软件测试网采编

  简略来说,编译器会对初始化列表按照成员变量的声明顺序重新一一排序,安插到构造函数中进行初始化操作,而且这些初始化操作在构造函数里面用户自己定义的任何代码之前。

  下面是c++源码:

class X {
private:
    int i;
    int j;
    int k;
    int l;
public:
    X() : j(1), i(2), l(3) {
        k = 4;
    }
};

int main() {
    X x;
}

  下面是main函数里面的汇编码:

; 13   : int main() {

    push    ebp
    mov    ebp, esp
    sub    esp, 16                    ; 为对象x预留16byte的空间

; 14   :     X x;

    lea    ecx, DWORD PTR _x$[ebp];将对象x的首地址传递给寄存器ecx,作为隐含参数传递给构造函数(即this指针)
    call    ??0X@@QAE@XZ                ; 调用构造函数

; 15   : }

    xor    eax, eax
    mov    esp, ebp
    pop    ebp
    ret    0
_main    ENDP

  下面是构造函数的汇编码:

??0X@@QAE@XZ PROC                    ; X::X, COMDAT
; _this$ = ecx

; 8    :     X() : j(1), i(2), l(3) {

    push    ebp
    mov    ebp, esp
    push    ecx;将寄存器ecx压栈的目的是为保留对象首地址预留空间
    mov    DWORD PTR _this$[ebp], ecx;将对象首地址存到刚才预留的空间里面
    mov    eax, DWORD PTR _this$[ebp];将对象首地址给寄存器eax
    mov    DWORD PTR [eax], 2;将2写入对象首地址所指内存,即将2赋给成员变量i
    mov    ecx, DWORD PTR _this$[ebp];将对象首地址给寄存器ecx
    mov    DWORD PTR [ecx+4], 1;将1赋给偏移对象首地址4byte处内存,即将1赋给成员变量j
    mov    edx, DWORD PTR _this$[ebp];将对象首地址给edx寄存器
    mov    DWORD PTR [edx+12], 3;将3写入偏移对象首地址12byte处,即将3赋给成员变量l

; 9    :         k = 4;

    mov    eax, DWORD PTR _this$[ebp];将对象首地址给寄存器eax
    mov    DWORD PTR [eax+8], 4;将4写入偏移对象首地址8byte处,即将4赋给成员变量k

; 10   :     }

    mov    eax, DWORD PTR _this$[ebp]
    mov    esp, ebp
    pop    ebp
    ret    0
??0X@@QAE@XZ ENDP

41/41234>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号