VS2015中奇怪的memcpy_s行为

问题描述 投票:3回答:1

最近我在分析一个应用程序,我注意到memcpy_s程序集实现的行为很奇怪。我正在谈论驻留在Microsoft Visual Studio 14.0 \ VC \ crt \ src \ i386 \ memcpy.asm中的实现我到达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。 使用Release | 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限制?

c++ visual-c++ assembly visual-studio-2015 memcpy
1个回答
1
投票

正如@EOF在他的评论中指出的那样,rep movsb就是优化。它将数据从字符串移动到字符串,因此称为“增强快速字符串”优化。所以我只是忽略了它,memcpy正在按预期工作。

© www.soinside.com 2019 - 2024. All rights reserved.