在gsl库中,span和array_view有什么区别?

103

在最近几个会议的演讲中,我听到了Bjarne Stroustrup和其他人提到了C++的新编码指南以及一些支持它们的类型。

具体来说,我记得他们举例使用span<T>而不是(T* p, int n)作为函数的参数(在谈话中大约32:00时);但我也记得建议使用array_view<T>。它们是两种选择,但概念相同吗?还是我混淆了事情,它们实际上并不相关?

我似乎找不到任何权威的定义,说明它们都应该关注什么。


1
@DavidHaim:请查看编辑,以及此处的示例链接[https://github.com/Microsoft/GSL/blob/master/include/span.h]。 - einpoklum
有一些数组视图的实现和提案已经在使用中了。你看过它们吗? - Yakk - Adam Nevraumont
1
我相信 array_view 已经更名为 span - Galik
@Galik:你能提供证据吗?如果可以,请将其作为答案编写,我会接受... - einpoklum
@Yakk:嗯,有点像,但我似乎看到了一些与之无关的东西,比如Microsoft C++ AMP的一部分等等。我想可能有不止一个名为“array_view”的东西在流传。 - einpoklum
@einpoklum,我在我的回答中添加了一个链接,其中宣布了重命名。 - Galik
3个回答

204
我们与图书馆工作组标准委员会的人们进行了交谈。他们希望将他们试图纳入标准的array_view设为只读。对于核心指南,我们需要一个可读写的抽象。为避免(潜在的)标准和指南支持库(GSL)之间的冲突,我们将我们的(可读写)array_view重命名为spanhttps://github.com/microsoft/gsl

43
const array_view<T>再加上array_view<const T>不够满意吗?” - einpoklum
感谢您致力于零成本抽象口号 - 我真的认为span可以帮助许多程序员避免犯傻瓜错误。不过,我认为这些新变化的沟通方式可以更清晰明了。我只是在想 - 这是否可以通过常规的随机访问迭代器来解决呢?这种类型是为了清晰而添加的吗? - Benjamin Gruenbaum
7
这是有关资源和悬空指针的讲话,span和GSL只是次要问题。看一下Neil MacIntosh在CppCon 2015上的演讲:“为安全的C++代码发展array_view和string_view”https://www.youtube.com/watch?v=C4Z3c4Sv52U ,或者看一下GSL源代码:https://github.com/microsoft/gsl 。我们还在制定正式(标准风格)的规范。 - Bjarne Stroustrup
6
有人担心 "view" 只意味着查看内容,而不是修改它们,因此有些人想为读/写版本使用不同的后缀。我认为没有人太在意存在只读的 array_view 类型。人们关心的是默认情况下 string_view 应该是只读的。 - Jeffrey Yasskin
1
作为一名图形编码人员,“视图”仅意味着一个人当前查看可读/写数据的视图(例如glViewPort,D3D的SetViewport),使“视图”只读是令人惊讶的,但在图形之外,我想我可以理解“视图”更像是一个只读窗口而不是一个可读/写窗口的感觉。 - Dwayne Robinson
显示剩余2条评论

52

3
我给你点了个赞,但是Bjarne Stroustrup(真的吗?)的回答更详细。 - einpoklum
41
不,我明白。我也可能会选择Bjarne Stroustrup而不是我。不(哭泣)把它(哭泣)当作个人问题(哇啊啊啊啊啊啊啊啊啊)…… - Galik
3
那条评论让我感到内心有所共鸣,所以我也点了个赞;-) - YePhIcK

14

来自图书馆演化工作组(LEWG)的文件P0122R(2016-02-12)正式将类型array_view重命名为span

更改日志

与R0版本的区别

  • 根据Kona会议上LEWG的反馈,将被提议的类型名称从array_view更改为span
  • [...]

我们还可以阅读:

对标准的影响

此提案是一个纯库扩展,不需要对标准类、函数或头文件进行任何更改。如果可以依赖于P0257中提出的byte类型和类型别名行为的更改,则会得到增强。

然而,如果被采纳,重载一些标准库函数以适应这个新类型可能会很有用(例如copy())。

span已经在标准C++(C++11)中实现,并成功地用于C++代码的商业静态分析工具以及商业办公生产力软件中。开源的参考实现可在https://github.com/Microsoft/GSL上找到。

在下一章中,本文介绍了只读可读写可变)访问方式:

元素类型和转换

span 必须通过模板参数 ValueType 配置其元素类型, 该类型必须是一个完整的对象类型,而不是抽象类类型。 span 支持对其封装的序列进行只读或可变访问。 要访问只读数据,用户可以声明一个 span<const T>, 而访问可变数据则使用 span<T>

[...]


请参阅Marius Bancila(2016年3月)的《指南支持库审查:span<T>,将span定义为:

指南支持库(GSL)是Microsoft实现C++核心准则中描述的一些类型和函数的库,由标准C++基金会维护。 GSL提供的类型之一是span<T>,以前称为array_view<T>

span<T>是一个非拥有的连续内存范围,建议使用它代替指针(和大小计数器)或标准容器(如std::vectorstd::array)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接