如何从迭代器推导连续内存

2024-05-17

不知何故,本土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.


random_access_iterator 是否意味着连续内存?

简短回答:不。

长答案:取决于类型。

示例:对于std::vector(使用随机访问迭代器)内存是所有值都位于可以访问的连续内存块中data() method.

For std::deque(也使用随机访问迭代器)您知道内存区域被划分为块(std::deque被设计为可以有效地插入/删除中间的元素),因此内存不可能是连续的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从迭代器推导连续内存 的相关文章

随机推荐