c – 为什么构造函数“返回”这个指针?
发布时间:2020-12-16 05:41:47 所属栏目:百科 来源:网络整理
导读:我注意到构造函数会在返回之前将其移动到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
我注意到构造函数会在返回之前将其移动到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可能要求建设者这样做,但我怀疑.无论如何,这些协议只适用于从图书馆出口的东西,而不是严格的程序内容. 这实际上可能是放置新表达式的问题,因为它表示不可避免的运行时开销,因为给定的指针通常已知为非空. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |