我看到生成的代码有所不同,这取决于我是否显式默认复制构造函数,或者手写同样的东西.它是一个简单的类,只保存一个int并在其上定义一些算术运算符.
clang和g ++都以类似的方式处理这种情况,因此它让我想知道是否存在基础语言要求,如果是这样,它在做什么?如果可能的话,寻找标准中的引用.:)
为了展示这一点,我用两种方式编写了average()函数,在原始int和Holders上运行.我希望这两个代码生成相同的代码.这是输出:
明确默认的复制构造函数:
average(Holder, Holder):
add esi, edi
mov eax, esi
shr eax, 31
add eax, esi
sar eax
ret
average(int, int):
add esi, edi
mov eax, esi
shr eax, 31
add eax, esi
sar eax
ret
Run Code Online (Sandbox Code Playgroud)
它是一样的!太棒了吧?当我忘记"默认"实现时,问题出现了,只需手写版本即可.到目前为止,我的印象是它应该具有与默认代码相同的结果代码,但事实并非如此.
手写的复制构造函数
average(Holder, Holder):
mov edx, DWORD PTR [rdx]
mov ecx, DWORD PTR [rsi]
mov rax, rdi
add ecx, edx
mov edx, ecx
shr edx, 31
add edx, ecx
sar edx …
Run Code Online (Sandbox Code Playgroud)