VS2015 中的奇数memcpy_s行为

Odd memcpy_s behaviour in VS2015

本文关键字:行为 memcpy VS2015      更新时间:2023-10-16

最近我正在分析一个应用程序,我注意到memcpy_s程序集实现的行为很奇怪。我说的是驻留在Visual Studio 14.0\VC\crt\src\i386\memcpy.asm Microsoft实现我正在达到CopyUpLargeMov:然后我希望它选择SSE2路径,或使用任何其他可用的优化实现。代码如下:

    CopyUpLargeMov:
        bt      __favor, __FAVOR_ENFSTRG        ; check if Enhanced Fast Strings is supported
        jnc     CopyUpSSE2Check                 ; if not, check for SSE2 support
        rep     movsb
        mov     eax,[esp + 0Ch]                 ; return original destination pointer
        pop     esi
        pop     edi
        M_EXIT

无论我做什么优化调整,它都不会达到CopyUpSSE2Check.
版本测试|Win32,VS2015 Upd3,Windows10 x64。

实际C++代码

std::vector<uint8_t> src(1024*1024*20,0);
std::vector<uint8_t> dst(1024*1024*20,0);
for (auto i = 0ul; i < 1000; ++i)
{
    memcpy_s(dst.data(), dst.size(), src.data(), src.size());
}

有什么想法吗?

EDIT001:
似乎 x64 没有表现出奇怪的行为,它属于代码的增强快速字符串优化部分。也许上面的x86限制?

正如@EOF在他的评论中指出的那样,rep movsb优化。它将数据从一个字符串移动到另一个字符串,即所谓的"增强快速字符串"优化。所以我只是忽略了它,memcpy正在按预期工作。