VS.net的中_Uninit_copy函数奇怪的memmove调用(附代码),请求解惑,该如何解决
VS.net的<memory>中_Uninit_copy函数奇怪的memmove调用(附代码),请求解惑
template <class _Ty1,
class _Ty2> inline
_Ty2 *_Uninit_copy(_Ty1 *_First, _Ty1 *_Last, _Ty2 *_Dest,
allocator <_Ty2> &, _Scalar_ptr_iterator_tag)
{ // copy [_First, _Last) to raw _Dest, (const) scalar type
size_t _Count = (size_t)(_Last - _First);
// 就是下面的语句,为什么要加_Count?
return ((_Ty2 *)memmove(&*_Dest, &*_First,
_Count * sizeof (*_First)) + _Count); // NB: non-overlapping move
}
------解决方案--------------------
代码好读多了吧。
现在你能看懂为啥要加_Count了吧。
------解决方案--------------------
// 就是下面的语句,为什么要加_Count?
返回值的意义:
memmove 返回的是 *_Dest,
+ _Count 就是返回 *_Dest 有效数据区域的末尾部分。
也就是 _Uninit_copy 返回拷贝结束后 _Dest 的最后位置。
template <class _Ty1,
class _Ty2> inline
_Ty2 *_Uninit_copy(_Ty1 *_First, _Ty1 *_Last, _Ty2 *_Dest,
allocator <_Ty2> &, _Scalar_ptr_iterator_tag)
{ // copy [_First, _Last) to raw _Dest, (const) scalar type
size_t _Count = (size_t)(_Last - _First);
// 就是下面的语句,为什么要加_Count?
return ((_Ty2 *)memmove(&*_Dest, &*_First,
_Count * sizeof (*_First)) + _Count); // NB: non-overlapping move
}
------解决方案--------------------
代码好读多了吧。
现在你能看懂为啥要加_Count了吧。
------解决方案--------------------
// 就是下面的语句,为什么要加_Count?
返回值的意义:
memmove 返回的是 *_Dest,
+ _Count 就是返回 *_Dest 有效数据区域的末尾部分。
也就是 _Uninit_copy 返回拷贝结束后 _Dest 的最后位置。