小编Ale*_*lex的帖子

MSVC:无效的 memcpy 优化?

考虑以下代码:

void MemMove8(void* dst, void* src)
{
    char tmp[8];
    memcpy(tmp, src, 8);
    memcpy(dst, tmp, 8);
}
Run Code Online (Sandbox Code Playgroud)

MSVC (16.7.1) x86 with /O2 为此函数生成以下程序集:

; _dst$ = ecx
; _src$ = edx
    mov eax, DWORD PTR [edx]
    mov DWORD PTR [ecx], eax
    mov eax, DWORD PTR [edx+4]
    mov DWORD PTR [ecx+4], eax
Run Code Online (Sandbox Code Playgroud)

但如果输入和输出缓冲区重叠,这将不起作用(在某些情况下)。

生成的代码对我来说似乎是错误的;或者这是一个有效的转换,我在这里遗漏了什么?

c++ x86 memcpy visual-c++ compiler-bug

15
推荐指数
1
解决办法
369
查看次数

删除移动构造函数的模糊重载

如果定义了BREAK,则g ++ 4.6.3和4.7.2无法编译以下代码(在c ++ 0x模式下).

template<class T> struct Test {
    Test(T&) {}
#ifdef BREAK
    Test(T&&) = delete;
#endif
};

void func(Test<int> const&) {}
void func(Test<double> const&) {}

int main()
{
    int x = 0;
    func(x);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

错误是

error: call of overloaded 'func(int&)' is ambiguous
Run Code Online (Sandbox Code Playgroud)

而铛3.2 RC2和VC11(如果我更换Test(T&&) = delete;private: Test(T&&);)接受的代码.

我看不出哪里应该含糊不清.

这是一个g ++问题吗?(我不知道在gcc bug列表中搜索什么...)

c++ g++

10
推荐指数
1
解决办法
962
查看次数

标签 统计

c++ ×2

compiler-bug ×1

g++ ×1

memcpy ×1

visual-c++ ×1

x86 ×1