要将 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
以及使用自定义迭代器的任何其他数据结构存在相同的问题。但如果我误解了什么,请告诉我。
因为它使用的是 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
的“误用时的未定义行为”