考虑以下 C++ 代码:
std::uint32_t func(std::uint32_t* p1, std::uint64_t* p2) {
*p2 = *p1;
return *p1;
}
Run Code Online (Sandbox Code Playgroud)
在 Clang 上编译会-O3产生以下反汇编结果(GCC 类似):
func(unsigned int*, unsigned long*):
mov eax, dword ptr [rdi]
mov qword ptr [rsi], rax
ret
Run Code Online (Sandbox Code Playgroud)
(现场演示: https: //godbolt.org/z/vKPvT7o51)
由于严格的别名规则,编译器假设p1和p2不指向相同的内存位置,因此不需要*p1从内存中重新加载 return 语句。到目前为止一切顺利,优化正在按我的预期进行。
现在考虑一段类似的代码,其中复制是通过以下方式完成的memcpy():
std::uint32_t func(std::uint32_t* p1, std::uint64_t* p2) {
std::memcpy(p2, p1, sizeof(std::uint32_t));
return *p1;
}
Run Code Online (Sandbox Code Playgroud)
反汇编(在 Clang 和 GCC 上相同):
func(unsigned int*, unsigned long*):
mov eax, dword ptr [rdi] …Run Code Online (Sandbox Code Playgroud)