相关疑难解决方法(0)

为什么 memcpy 会导致编译器似乎忘记严格别名?

考虑以下 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

由于严格的别名规则,编译器假设p1p2不指向相同的内存位置,因此不需要*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)

c++ assembly gcc compiler-optimization language-lawyer

6
推荐指数
0
解决办法
460
查看次数