[英]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.