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

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

概述我注意到构造函数会在返回之前将其移动到eax.这是一个返回值还是别的? class CTest { int val_;public: CTest() {0093F700 push ebp 0093F701 mov ebp,esp 0093F703 sub esp,0CCh 0093F709 push @H_419_0@我注意到构造函数会在返回之前将其移动到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等)来发出失败信号.

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

总结

以上是内存溢出为你收集整理的c – 为什么构造函数“返回”这个指针?全部内容,希望文章能够帮你解决c – 为什么构造函数“返回”这个指针?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1249185.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-07
下一篇2022-06-07

发表评论

登录后才能评论

评论列表(0条)

    保存