不知何故,本土stl::copy()
VC++ (Dinkumware) 上的算法表明它可以使用memcpy()
可以轻松复制的数据。一个凡人能做到这一点吗? - 假设每个元素都是普通可复制的。
random_access_iterator 是否意味着连续内存?标准我不清楚。
因此,如果模板中只有一个或两个迭代器,是否可以在编译时推断出底层数组可以被复制memcpy()
,如果是的话怎么办?
编辑-这是我的动机。我有一个例程,可以移动数据块而不是复制它。为了在数据可内存移动时提高速度,我有时会调用 stl::copy 。我想知道这是否是唯一的方法。 (小时候,我总是会在家里尝试这个。)
// Move a range of values
template<class Ptr, class Ptr2>
inline Ptr2 move(Ptr src, Ptr end, Ptr2 dest) {
using value_type = std::iterator_traits<Ptr>::value_type;
if constexpr (std::is_trivially_copyable_v<value_type>) {
return std::copy(src, end, dest);
} else {
while (src != end) {
*dest = std::move(*src);
++src; ++dest;
}
}
return dest;
}
编辑:感谢 zett42 找到这个相关问题:连续迭代器检测 https://stackoverflow.com/questions/42851957/contiguous-iterator-detection我无法解释我是如何错过它的。
编辑更多:在经历了许多曲折的小段落之后,我发现 Dinkum 对人群中的迭代器使用秘密标签,例如_Really_trivial_ptr_iterator_tag。所以前景看起来很暗淡。
我的 0.02 美元价值:将 iterator_category 设为临时类型而不是消除各种特征(例如“points_into_contigious_memory”等)是初学者的错误...由于 random_access_iterator 是仅用标签表示的临时类型,因此它不能可以在不破坏遗留应用程序的情况下进行子类型化。所以委员会现在有点陷入困境。是时候重新开始了,我说。
Oh well.