如何高效地从 gsl::span 复制到 std::vector?

问题描述 投票:0回答:1

要将 C++20

std::span
复制到
std::vector
,我可以简单地执行以下操作:

void WriteBuffer(std::vector<std::byte>& destData, const std::span<const std::byte>& srcData)
{
    std::copy(srcData.begin(), srcData.end(), destData.end());
}

..将优化为单个

memmove
。请参阅示例:https://godbolt.org/z/8nPjzj3c6

但是,如果我将

std::span
替换为
gsl::span
,我们将不再获得此优化:https://godbolt.org/z/MWfPKW8eq

最好调整向量大小并使用

std::memcpy
复制数据,还是有更好的替代方案?

我的理解是

gsl::span
没有得到优化,因为它使用的是
std::copy
的实现不知道的自定义迭代器 - 因此它无法对数据的线性度做出假设 - 是这样吗?如果是这样,我想所有 STL 容器和算法都会对
gsl::span
以及使用自定义迭代器的任何其他数据结构存在相同的问题。但如果我误解了什么,请告诉我。

c++ stl gsl
1个回答
0
投票

因为它使用的是 std::copy 的实现不知道的自定义迭代器

其实不然。标准库将看到这个(有条件定义的)成员并对数据布局具有相同的知识。

#if defined(__cpp_lib_ranges) || (defined(_MSVC_STL_VERSION) && defined(__cpp_lib_concepts))
    using iterator_concept = std::contiguous_iterator_tag;
#endif // __cpp_lib_ranges

更可能的原因是迭代器操作是在运行时检查的,而不是

std::span

的“误用时的未定义行为”
© www.soinside.com 2019 - 2024. All rights reserved.