C++ stl复制功能的实现?
下面是std::copy函数的一些实现细节(来自vs2015):C++ stl复制功能的实现?,c++,c++11,visual-studio-2015,c++-standard-library,C++,C++11,Visual Studio 2015,C++ Standard Library,下面是std::copy函数的一些实现细节(来自vs2015): 模板内联 _输出复制执行(\u InIt\u First,\u InIt\u Last, _OutIt _Dest,_标量_ptr _迭代器_标记) {//copy[_First,_Last)to[_Dest,…),指向标量的指针 ptrdiff\u t\u Count=\u Last-\u First; _CSTD memmove(&*_Dest,&*_First, _Count*sizeof(*u First)); 返回(_D
模板内联
_输出复制执行(\u InIt\u First,\u InIt\u Last,
_OutIt _Dest,_标量_ptr _迭代器_标记)
{//copy[_First,_Last)to[_Dest,…),指向标量的指针
ptrdiff\u t\u Count=\u Last-\u First;
_CSTD memmove(&*_Dest,&*_First,
_Count*sizeof(*u First));
返回(_Dest+_Count);
}
似乎我们可以在标量类型的情况下使用memmove。但是如果它是POD类型(C++11),为什么我们不能使用memmove呢?据我所知,它既简单又复杂
标准布局。特殊要求是“可复制的” 对于任何普通可复制类型
T
,如果指向T
的两个指针指向
不同的T
对象obj1
和obj2
,其中既不是obj1
也不是
obj2
是基类子对象,如果底层字节(1.7)
向上obj1
复制到obj2
,43obj2
随后应保持不变
与obj1
相同的值
43)例如,通过使用库函数(17.6.1.2)
std::memcpy
或std::memmove
除其他外,POD和标量满足了这一要求。但VC++的要求比必要的范围更窄。libstdc++也是如此,它要求类型是完全平凡的。仅对
进行libc++测试就可以轻松地复制指定的“但如果它是POD类型,为什么我们不能使用memmove呢?”您已经展示了std::copy
的一个实现,但没有显示标记分派。为POD选择的是什么版本,以及标记分派是如何实现的?libc++使用是可分配的
(以及附加的次要类型检查)将std::copy
发送到memmove
@dyp libstdc++基本上使用\uuuuuuuuuuu是微不足道的(\uValueTypei)
。有点让人困惑,因为有一些可复制的可分配类不是普通类。@dyp我已经看过MSVC2013,它实际上只使用scalar_标记来执行memmove
。此外,此标记仅为is_scalar::value
设置。
template<class _InIt,
class _OutIt> inline
_OutIt _Copy_impl(_InIt _First, _InIt _Last,
_OutIt _Dest, _Scalar_ptr_iterator_tag)
{ // copy [_First, _Last) to [_Dest, ...), pointers to scalars
ptrdiff_t _Count = _Last - _First;
_CSTD memmove(&*_Dest, &*_First,
_Count * sizeof (*_First));
return (_Dest + _Count);
}