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


94

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

具体来说,我记得这个例子,span<T>而不是(T* p, int n)作为函数的参数(大约在32:00进行讨论);但我也记得要使用的建议array_view<T>。他们是两个选择,但概念相同吗?还是让我感到困惑,而它们实际上并没有那么相关?

我似乎找不到关于它们都应该有的权威定义。


@DavidHaim:请参见编辑,例如此处
einpoklum

野外有数组视图的实现和建议。你看过他们吗?
Yakk-Adam Nevraumont

1
相信array_view已重命名为span
Galik '16

@Galik:你能提供证据吗?如果可以的话,请写下来作为答案,我会接受...
einpoklum

@Yakk:是的,有一点,但是我似乎看到了一些不一定相关的东西,例如Microsoft C ++ AMP的一部分等。我发现可能有不止一件东西被命名为array_view浮动。
einpoklum

Answers:


188

我们跟人说话的在库工作组标准委员会。他们希望array_view他们试图成为只读标准。对于核心准则,我们需要读写的抽象。为了避免(潜在)标准与准则支持库(GSL)之间发生冲突,我们将(读和写)重命名array_viewspanhttps : //github.com/microsoft/gsl


41
const array_view<T>array view<const T>不令人满意?
einpoklum

感谢您致力于零成本抽象的口头禅-我确实的确认为span这样可以避免很多程序员犯傻错误。我认为,传达这些新变化的方式可能会更加清晰。我只是在想-使用常规的随机访问迭代器可以解决此问题吗?是否只是为了清楚起见添加了类型?
本杰明·格伦鲍姆

6
这是关于资源和悬空指针的讨论。范围和GSL是附带问题。看看Neil MacIntosh在CppCon 2015上的演讲:“不断发展array_view和string_view以获取安全的C ++代码” youtube.com/watch?v=C4Z3c4Sv52U和/或看看GSL来源:github.com/microsoft/gsl。工作,也对正规(标准型)规范。
Bjarne的Stroustrup的

5
令人担心的是,“视图”意味着仅查看内容而不修改内容,因此有些人希望为读/写版本使用不同的后缀。我认为没有人关心现有的只读array_view类型。默认情况下,人们关心的是string_view为只读。
杰弗里·亚斯金

作为一种图形编码器,“视图”仅表示当前对读/写数据的视图(例如glViewPort,D3D的SetViewport),将“视图”设置为只读是令人惊讶的,但是在外部图形中,我想我会看到“视图”的感觉更多类似于只读窗口而不是读/写窗口。
Dwayne Robinson

45

CppCoreGuidlines中,原始名称array_view已重命名为span

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

因此描述如下:

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


2
我为您+1,但是Bjarne Stroustrup(是吗?)的答案更为详细。
einpoklum

30
@einpoklum不,我明白了。我可能也会选择Bjarne Stroustrup而不是我。不(嗅探)接受(嗅探)它(嗅探)个人(wahhhhhh)...
Galik 2016年

1
该评论使我感到内心有些
不适

11

图书馆发展工作组(LEWG)的文件P0122R(2016-02-12 )正式将类型重命名
array_viewspan

变更日志

从R0开始的变化

  • 该类型的更名被提出array_viewspan在科纳会议后从LEWG反馈。
  • [...]

我们还可以阅读:

对标准的影响

该建议是纯库扩展。它不需要对标准类,函数或标头进行任何更改。如果可能取决于P0257中byte建议的类型和类型别名行为的更改,它将得到增强。

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

span已在标准C ++(C ++ 11)中实现,并已成功用于C ++代码的商业静态分析工具以及商业办公效率软件中。可从https://github.com/Microsoft/GSL获得开源的参考实现。

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

元素类型和转换

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

[...]


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

准则支持库是一些在所描述的类型和功能的Microsoft实现C ++核心准则 保持在标准C ++基金会。在GSL提供的类型中,span<T>以前称为array_view<T>

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.