高级啊,你这一句话,我查了calling convention的资料,想了好久才明白啥意思,
你看理解的对不:以 _cdel 64为例,分析
返回指针时,大小固定,返回值写入RAX即可。
返回自定义类型时T,又超过128bit,caller 得负责构造T,将T指针作为参数1传入
在covariance+智针的场景,构造T,即是构造unique_ptr。——哎,好像没问题哈!
unique_ptr的size是固定的哇,等于裸指针(再加个deleter地址,maybe)。
又想了下,构造T有问题,编译器看到 pB->Clone()不知道T的类型是Base还是Child。
又又想了下,unique_ptr当作自定义类型不合适。大小固定,起码64位是可以fit进某个寄存器的。 32位的话,得搞个寄存器对。
所以标准肯定是不想只给智能指针开口子。楼里有位大侠说的有道理。
参考:
https://docs.microsoft.com/en-us/cpp/build/x64-calling-convention?view=msvc-160#return-values【 在 here080 的大作中提到: 】
: 此处可以结合底层机理来理解。
: 函数调用是在栈上面的指针移动,返回值一般就是最后留下来的那一块。如果编译器不知道返回值的大小,那就会有很多问题。
--
修改:DoorWay FROM 222.90.57.*
FROM 222.90.57.*