【问题标题】:What's the difference between span and array_view in the gsl library?gsl 库中的 span 和 array_view 有什么区别?
【发布时间】:2016-04-22 06:54:27
【问题描述】:

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

具体来说,我记得the example of span<T> instead of (T* p, int n) as a parameter to a function(谈话开始时间大约是 32:00);但我也记得使用array_view<T> 的建议。它们是两种选择但相同的概念吗?还是我混淆了事情,它们实际上并没有那么相关?

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

【问题讨论】:

  • @DavidHaim:请参阅编辑,例如 here
  • 有很多数组视图的实现和提议。你看过它们吗?
  • 我相信array_view改名为span
  • @Galik:你能提供证据吗?如果可以,请将其写为答案,我会接受...
  • @Yakk:嗯,是的,有点,但我似乎看到了一些不一定相关的东西,比如 Microsoft C++ AMP 的一部分等。我想可能不止一个东西叫做 @987654328 @ 飘来飘去。

标签: c++ cpp-core-guidelines guideline-support-library array-view


【解决方案1】:

我们在standards committee 中与library working group 中的人交谈。他们希望他们试图进入标准的array_view 是只读的。对于核心指南,我们需要一个可读写的抽象。为避免(潜在)标准和指南支持库 (GSL) 之间发生冲突,我们将(读写)array_view 重命名为 spanhttps://github.com/microsoft/gsl

【讨论】:

  • const array_view<T> 加上array view<const T> 不满意?
  • 感谢您致力于零成本抽象的口头禅——我真的认为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。我们还在制定正式(标准样式)规范.
  • 有人担心“视图”意味着只查看内容,而不是修改它们,因此有些人希望读/写版本具有不同的后缀。我认为没有人关心存在的只读 array_view 类型。人们关心的 string_view 默认是只读的。
  • 作为一个图形编码器,其中“视图”仅表示当前对读/写数据的视图(例如 glViewPort,D3D 的 SetViewport),将“视图”设置为只读是令人惊讶的,但在图形之外,我想我可以看到“视图”感觉更像是一个只读窗口而不是读/写窗口。
【解决方案2】:

CppCoreGuidlines中原来的array_view改名为span

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

是这样描述的:

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

【讨论】:

  • 我为你 +1 了,但 Bjarne Stroustrup(真的吗?)的回答更详细。
  • @einpoklum 不,我明白了。我可能也会选择 Bjarne Stroustrup 而不是我。不(嗅)拿(嗅)它(嗅)个人(哇哇哇)......
  • 那条评论让我有内在的感觉,所以我也 +1 了 ;-)
【解决方案3】:

Library Evolution Working Group (LEWG) 的文档 P0122R (2016-02-12)
正式将类型 array_view 重命名为 span强>:

更新日志

与 R0 相比的变化

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

我们也可以阅读:

对标准的影响

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

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

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

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

元素类型和转换

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

[...]


另请参阅 Marius Bancila(2016 年 3 月)将 span 定义为的 Guidelines Support Library Review: span<T>

Guidelines Support Library 是 Microsoft 实现 C++ Core Guidelines 中描述的一些类型和功能 由Standard C++ Foundation 维护。 GSL 提供的类型包括span<T>,以前称为array_view<T>

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

【讨论】:

    猜你喜欢
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多