微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – 为什么构造函数“返回”这个指针?

我注意到构造函数会在返回之前将其移动到eax.这是一个返回值还是别的?
class CTest {
    int val_;
public:
    Ctest() {
0093F700  push        ebp  
0093F701  mov         ebp,esp  
0093F703  sub         esp,0CCh  
0093F709  push        ebx  
0093F70A  push        esi  
0093F70B  push        edi  
0093F70C  push        ecx  
0093F70D  lea         edi,[ebp-0CCh]  
0093F713  mov         ecx,33h  
0093F718  mov         eax,0CCCCCCCCh  
0093F71D  rep stos    dword ptr es:[edi]  
0093F71F  pop         ecx  
0093F720  mov         dword ptr [this],ecx  
        val_ = 1;
0093F723  mov         eax,dword ptr [this]  
0093F726  mov         dword ptr [eax],1  
    }
0093F72C  mov         eax,dword ptr [this]  
0093F72F  pop         edi  
0093F730  pop         esi  
0093F731  pop         ebx  
0093F732  mov         esp,ebp  
0093F734  pop         ebp  
0093F735  ret

VS2012调试模式

我发现新的将使用它的“返回值”.好像if(operator new()== 0)return 0; else return constructor();

class CTest {
    int val_;
public:
    Ctest() {
        val_ = 1;
        __asm {
            mov         eax,0x12345678
            pop         edi  
            pop         esi  
            pop         ebx  
            mov         esp,ebp  
            pop         ebp  
            ret  
        }
    }
};

int main() {
    CTest *test = new CTest;    // test == 0x12345678
    return 0;
}

解决方法

你的第二个问题不同意你的第一个问题.如果新的使用if(operator new()== 0)return 0; else return constructor();如果constructor()生成条件结果?

无论如何…

编译器使用的是编译器的业务.寄存器往往保留任何信息立即有用,并且如果编译器被写入,相信每次使用构造函数时,该对象将被立即使用,则可以合理地选择将其放在寄存器中.

ABI可能要求建设者这样做,但我怀疑.无论如何,这些协议只适用于从图书馆出口的东西,而不是严格的程序内容.
>在继续初始化对象之前,任何新的表达式都会检查operator new的结果为0. operator new可能会通过返回nullptr(或NULL等)来发出失败信号.

这实际上可能是放置新表达式的问题,因为它表示不可避免的运行时开销,因为给定的指针通常已知为非空.

原文地址:https://www.jb51.cc/c/113972.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐