提问人:einpoklum 提问时间:1/17/2016 最后编辑:einpoklum 更新时间:8/26/2017 访问量:34950
gsl 库中的 span 和 array_view 有什么区别?
What's the difference between span and array_view in the gsl library?
问:
在最近的几次会议演讲中,我听到Bjarne、Stroustrup和其他人提到了C++的新编码指南以及一些支持它们的类型。
具体来说,我记得 span<T>
而不是 (T* p, int n)
作为函数的参数的例子(在谈话开始的 32:00 左右);但我还记得使用.它们是两种选择,但概念相同吗?还是我混淆了事情,它们实际上并不那么相关?array_view<T>
我似乎找不到任何权威的定义来定义它们都应该是什么。
答:
在 CppCoreGuidlines 中,原始版本已重命名为 .array_view
span
请参见:https://github.com/isocpp/CppCoreGuidelines/pull/377
它是这样描述的:
span 是使用指针访问数组的边界检查安全替代方案
评论
我们与标准委员会图书馆工作组的成员进行了交谈。他们希望他们试图进入标准的内容是只读的。对于核心准则,我们需要一个可读和可写的抽象。为了避免(潜在)标准和指南支持库(GSL)之间的冲突,我们将(读取和写入)重命名为:https://github.com/microsoft/gsl。array_view
array_view
span
评论
const array_view<T>
array view<const T>
span
库演进工作组 (LEWG
) 的文档 P0122R (2016-02-12) 正式将类型array_view
重命名为 span
:
更改日志
与 R0 相比的变化
- 将提议的类型名称从更改为根据 LEWG 在 Kona 会议上的反馈。
array_view
span
- [...]
我们还可以阅读:
对标准的影响
这个提议是一个纯粹的库扩展。 它不需要对标准类、函数或标头进行任何更改。 如果可以取决于类型,它将得到增强 以及 P0257 中提出的对类型别名行为的更改。
byte
但是,如果采用,为这种新类型重载一些标准库函数可能会很有用(例如)。
copy()
span
已在标准 C++ (C++11) 中实现并成功实现 用于 C++ 代码的商业静态分析工具以及商业办公生产力软件。 https://github.com/Microsoft/GSL 上提供了开源的参考实现。
在下一章中,本文档将介绍只读和读写(可变)访问:
元素类型和转换
span
必须使用其元素类型进行配置 通过 template 参数, 它必须是完整的对象类型 这不是一个抽象类类型。 支持对其封装的序列进行只读或可变访问。 要访问只读数据,用户可以声明一个 , 对可变数据的访问将使用 .ValueType
span
span<const T>
span<T>
[...]
另请参阅Marius Bancila(2016年3月)的指南支持库评论:span<T>
,其定义为:span
指南支持库是 Microsoft 的实现 标准 C++ 基金会维护的 C++ 核心指南中描述的一些类型和函数。 在 GSL 提供的类型中,以前称为 .
span<T>
array_view<T>
span<T>
是建议使用的非拥有范围的连续内存,而不是 指针(和大小计数器)或标准容器(如 或 )。std::vector
std::array
评论
array_view
span
array_view