关闭

从汇编看c++内联函数评估求值

发表于:2013-6-28 10:46

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

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

  在c++中,一个inline函数实体,在整个class 声明未被完全看到之前,是不会被评估求值的,也就是说,对于类里面内联的成员函数本身的分析,要等到class的声明完全结束之后才开始。

  下面试c++源码:

extern int x;//外部声明的x

class X {
public:
    float getX() const {
        return x;//x绑定的是哪个?
    }
private:
    float x;//类自身的成员变量x
};

int main() {
   X xObj;
   float x;
   x = xObj.getX();
}

  依据上面的规则,内联函数getX绑定的将会是成员变量x(float型)

  下面我们只看成员函数getX的汇编码:

?getX@X@@QBEMXZ PROC                    ; X::getX, COMDAT
; _this$ = ecx

; 5    :     float getX() const {

    push    ebp
    mov    ebp, esp
    push    ecx;压栈到的目的是为了保存对象xObj的首地址(即this指针)预留空间
    mov    DWORD PTR _this$[ebp], ecx;寄存器ecx中保留xObj对象首地址,存放到刚才分配的空间

; 6    :         return x;

    mov    eax, DWORD PTR _this$[ebp];将对象xObj对象首地址给eax寄存器
    fld    DWORD PTR [eax];将对象首地址处内存内容写入到浮点数寄存器ST(0)中,作为返回值 也就是将成员变量x的值返回
                       ;可以看到,x确实绑定的是成员变量

; 7    :     }

    mov    esp, ebp
    pop    ebp
    ret    0
?getX@X@@QBEMXZ ENDP

  但是,这种规则对于成员函数的参数却不是这样。

  下面是c++源码:

typedef int length;//全局

class X {
public:
    void setI(length x)  {//length是什么类型?
        i = x;
    }
private:
    typedef float length;//类成员
    length i;
};

int main() {
   X xObj;
   xObj.setI(1.1);
}

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

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号