簡體   English   中英

VS2015中奇怪的memcpy_s行為

[英]Odd memcpy_s behaviour in VS2015

最近我在分析一個應用程序,我注意到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限制?

正如@EOF在他的評論中指出的那樣, rep movsb 就是優化。 它將數據從字符串移動到字符串,因此稱為“增強快速字符串”優化。 所以我只是忽略了它, memcpy正在按預期工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM