VS2015 中的奇数memcpy_s行为
Odd memcpy_s behaviour in VS2015
最近我正在分析一个应用程序,我注意到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
正在按预期工作。
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- arr[-1]在c++中的奇怪行为
- 继承期间显示未知行为的子类
- 如何在c++中使用引用实现类似python的行为
- G锁定铸造到基础上会释放模拟行为
- 在C++中对T*类型执行std::move的意外行为
- std::当在256字节边界上写入整数时,流的奇怪行为
- 不知道某个东西是否被忽略会引入未定义的行为吗
- 奇怪的构造函数行为
- 重载运算符new[]的行为取决于析构函数
- 不同语言中相同代码的不同行为
- 处理除以零会导致<csignal>意外行为
- 将结构 std::memcpy 转换为具有足够容量的 std::vector 是未定义的行为<char>吗?
- 是std::memcpy在不同的可复制类型之间的未定义行为
- 为什么 std::memcpy(作为类型双关语的替代方案)不会导致未定义的行为?
- 为什么对于不可TriviallyCopy的对象,std::memcpy的行为是未定义的
- 使用 memcpy 移动非 POD C++对象是否总是调用未定义行为
- Memcpy的行为方式出乎意料
- C++ memcpy() 棘手的使用,需要行为理解