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

What's the difference between span and array_view in the gsl library?

提问人:einpoklum 提问时间:1/17/2016 最后编辑:einpoklum 更新时间:8/26/2017 访问量:34950

问:

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

具体来说,我记得 span<T> 而不是 (T* p, int n) 作为函数的参数的例子(在谈话开始的 32:00 左右);但我还记得使用.它们是两种选择,但概念相同吗?还是我混淆了事情,它们实际上并不那么相关?array_view<T>

我似乎找不到任何权威的定义来定义它们都应该是什么。

C++ cpp-core-guidelines 指南-支持库 数组视图

评论

1赞 einpoklum 1/17/2016
@DavidHaim:例如,请参阅编辑以及此处
0赞 Yakk - Adam Nevraumont 1/17/2016
在野外有数组视图实现和建议。你看过吗?
1赞 Galik 1/17/2016
我相信它已重命名为 .array_viewspan
0赞 einpoklum 1/17/2016
@Galik:你能提供证据吗?如果可以的话,把它写成一个答案,我会接受......
0赞 einpoklum 1/17/2016
@Yakk:嗯,是的,有点,但我似乎看到了不一定相关的东西,比如Microsoft C++ AMP的一部分等。我想可能不止一个名字在漂浮。array_view

答:

52赞 Galik 1/17/2016 #1

CppCoreGuidlines 中,原始版本已重命名为 .array_viewspan

请参见:https://github.com/isocpp/CppCoreGuidelines/pull/377

它是这样描述的:

span 是使用指针访问数组的边界检查安全替代方案

评论

3赞 einpoklum 1/17/2016
我+1's 你,但 Bjarne Stroustrup(真的吗?的回答更详细。
41赞 Galik 1/17/2016
@einpoklum 不,我明白了。我可能也会选择 Bjarne Stroustrup 而不是我。不是(嗅)拿(嗅)它(嗅)个人(哇)......
3赞 YePhIcK 6/26/2018
那句话让我感觉到了内心的东西,所以我也+1了;-)
204赞 Bjarne Stroustrup 1/17/2016 #2

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

评论

43赞 einpoklum 1/17/2016
而且加不尽如人意?const array_view<T>array view<const T>
0赞 Benjamin Gruenbaum 1/17/2016
感谢您致力于零成本抽象的口头禅 - 我真的认为可以避免很多程序员犯愚蠢的错误。不过,我认为可以以更清晰的方式传达这些新变化。我只是想知道 - 这难道不是可以用常规随机访问迭代器清楚地解决的问题吗?添加类型只是为了清楚起见吗?span
7赞 Bjarne Stroustrup 1/17/2016
这是一场关于资源和悬而未决的指针的演讲。span 和 GSL 是一个附带问题。请看 Neil MacIntosh 在 CppCon 2015 上的演讲:“Evolving array_view and string_view for safe C++ code”,youtube.com/watch?v=C4Z3c4Sv52U 和/或查看 GSL 源代码:github.com/microsoft/gsl .我们还在制定正式(标准样式)规范。
6赞 Jeffrey Yasskin 1/22/2016
有人担心“视图”意味着只看内容,而不是修改它们,所以有些人想要读/写版本不同的后缀。我认为没有人关心现有的只读array_view类型。人们string_view关心默认情况下是只读的。
1赞 Dwayne Robinson 1/22/2016
作为一个图形编码器,其中“视图”仅意味着一个人对读/写数据的当前视图(例如 glViewPort、D3D 的 SetViewport),将“视图”设置为只读是令人惊讶的,但在图形之外,我想我可以看到“视图”感觉更像是一个只读窗口,而不是读/写窗口。
14赞 oHo 3/25/2016 #3

库演进工作组 (LEWG
) 的文档 P0122R (2016-02-12) 正式将类型array_view重命名为 span

更改日志

与 R0 相比的变化

  • 将提议的类型名称从更改为根据 LEWG 在 Kona 会议上的反馈。array_viewspan
  • [...]

我们还可以阅读:

对标准的影响

这个提议是一个纯粹的库扩展。 它不需要对标准类、函数或标头进行任何更改。 如果可以取决于类型,它将得到增强 以及 P0257 中提出的对类型别名行为的更改。byte

但是,如果采用,为这种新类型重载一些标准库函数可能会很有用(例如)。copy()

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

在下一章中,本文档将介绍读和读写可变)访问:

元素类型和转换

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

[...]


另请参阅Marius Bancila(2016年3月)的指南支持库评论:span<T>,其定义为:span

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

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