关闭

从汇编看c++对静态成员的存取

发表于:2013-7-01 09:57

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

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

  c++中静态成员变量不存在于对象之中,而存在于全局数据段,只是其可见性受到限制,仅能被所属类访问,而非静态成员变量存在于对象中,因而,在访问两种不同数据成员时,会有些许差别。

  对于静态数据成员的访问,是直接操作其所在内存;对于非静态数据成员,则是由对象首地址 + 成员变量相对于对象首地址的偏移量来访问(对涉及到虚拟继承可能更复杂),有一定的间接性。

  下面看c++源码:

class X {
public:
    static int x1;
    int x2;
    int x3;
};

 int X::x1 = 1;

int main() {
    X x;
    X* xp = &x;
    x.x1 = 1;
    xp->x1 = 2;
    X::x1 = 3;
   
    x.x3 = 1;
    xp->x3 = 2;
}

  其中静态成员变量分了三种方式存取。

  下面是main函数对应的汇编码:

; 10   : int main() {

    push    ebp
    mov    ebp, esp
    sub    esp, 12                    ; 为变量预留12byte空间,8byte给对象x 4byte给指针xp

; 11   :     X x;
; 12   :     X* xp = &x;

    lea    eax, DWORD PTR _x$[ebp];获取对象首地址,存入寄存器eax
    mov    DWORD PTR _xp$[ebp], eax;将对象首地址给指针xp

; 13   :     x.x1 = 1;

    mov    DWORD PTR ?x1@X@@2HA, 1            ; 将1赋给?x1@X@@2HA(即静态成员变量x1所在内存)所处的内存

; 14   :     xp->x1 = 2;

    mov    DWORD PTR ?x1@X@@2HA, 2            ; 将2赋给?x1@X@@2HA(即静态成员变量x1所在内存)所处的内存

; 15   :     X::x1 = 3;

    mov    DWORD PTR ?x1@X@@2HA, 3            ; 将3赋给?x1@X@@2HA(即静态成员变量x1所在内存)所处的内存

; 16   :    
; 17   :     x.x3 = 1;

    mov    DWORD PTR _x$[ebp+4], 1;将1赋给偏移变量首地址4byte处内存,即将1赋给成员变量x3

; 18   :     xp->x3 = 2;

    mov    ecx, DWORD PTR _xp$[ebp];将指针xp存的值(对象首地址)给寄存器ecx
    mov    DWORD PTR [ecx+4], 2;将2赋给偏移变量首地址4byte处内存,即将2赋给成员变量x3
                            ;对于非静态成员变量,访问的方式为对象首地址 + 成员变量相对于对象首地址的偏移量来完成
                            ;而不是想静态成员变量一样,直接操作其内存

; 19   : }

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

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

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号