当前位置: 首页 > 知识库问答 >
问题:

什么是“跨度”,什么时候应该使用?

东郭昌胤
2023-03-14

最近,我收到了在代码中使用span 's的建议,或者在站点上看到了一些使用span's的答案--应该是某种容器。但是--我在C++17标准库里找不到类似的东西。

那么这个神秘的span 是什么?如果它是非标准的,为什么(或何时)使用它是个好主意?

共有1个答案

宫子晋
2023-03-14

span 是:

  • 内存T类型的连续值序列的非常轻量级的抽象。
  • 基本上是一个结构{T*ptr;std::size_t length;}和一系列方便的方法。
  • 非所有类型(即“引用类型”而不是“值类型”):它从不分配或释放任何东西,也不保持智能指针活动。

它以前被称为array_view,甚至更早被称为array_ref

    null

现在来看看何时实际使用它:

当分配的长度或大小也很重要时,请使用span (分别为span )而不是独立的t*(分别为const t*)。因此,替换如下函数:

void read_into(int* buffer, size_t buffer_size);

与:

void read_into(span<int> buffer);
    null

有时让编译器为您做更多的工作。例如,这:

int buffer[BUFFER_SIZE];
read_into(buffer, BUFFER_SIZE);

变成这样:

int buffer[BUFFER_SIZE];
read_into(buffer);

...它会做你想让它做的事情。另见准则P.5。

为什么只在C++20?嗯,虽然这个想法并不新鲜--它目前的形式是与C++核心指导方针项目一起构思的,该项目在2015年才开始形成。所以花了一段时间。

它是核心指南支持库(GSL)的一部分。实现:

  • Microsoft/Neil Macintosh的GSL包含一个独立的实现:GSL/span
  • GSL-Lite是整个GSL的单头实现(没有那么大,不用担心),包括span .
    null
 类似资料:
  • 问题内容: 我知道他们两个都禁用了Nagle的算法。 我什么时候应该/不应该使用它们中的每一个? 问题答案: 首先,不是所有人都禁用Nagle的算法。 Nagle的算法用于减少有线中更多的小型网络数据包。该算法是:如果数据小于限制(通常是MSS),请等待直到收到先前发送的数据包的ACK,同时累积用户的数据。然后发送累积的数据。 这将对telnet等应用程序有所帮​​助。但是,在发送流数据时,等待A

  • 问题内容: 在该类中,有两个字符串,和。 有什么不同?我什么时候应该使用另一个? 问题答案: 如果你的意思是和则: 用于在文件路径列表中分隔各个文件路径。考虑在上的环境变量。您使用a分隔文件路径,因此在上将是;。 是或用于拆分到特定文件的路径。例如在上,或

  • 邮件列表和网上讨论中似乎经常出现的一个话题是攻读计算机科学学位的优点(或不足)。对于否定的一方来说,一个似乎一再出现的论点是,他们已经编码了一些年了,他们从来没有使用过递归。 所以问题是: 什么是递归? 何时使用递归? 为什么人们不使用递归?

  • 问题内容: 在集成我以前从未使用过的Django应用程序时,我发现了用于定义类中函数的两种不同方式。作者似乎非常有意地使用了它们。第一个是我自己经常使用的: 另一个是我不使用的,主要是因为我不知道何时使用它,以及什么用途: 在Python文档中,装饰器的解释如下: 类方法将类作为隐式第一个参数接收,就像实例方法接收实例一样。 所以我想指的是自己(而不是实例)。我不完全理解为什么会这样,因为我总是可

  • 问题内容: 我看过各种文章,但我仍然不知道为什么不应该使用它。请让我知道您的想法。 问题答案: 我发现有必要在错误的设计中使用instanceof提示。可以肯定的是,将会出现一个大型,复杂的开关风格的构造。在我看到的其他大多数情况下,我们应该使用多态而不是instanceof。请参阅策略模式。(相关的使用示例) 我唯一需要使用的是实现时。

  • 问题内容: 我在阅读《 Swift编程语言》指南 时遇到了一个叫做的函数,但我仍然想知道为什么以及何时需要实现它,因为我们实际上不需要管理内存。 问题答案: 不需要实现该方法,但是如果需要在取消分配对象之前进行一些操作或清理,则可以使用它。 在苹果的文档包括例如: 因此,无论何时将玩家从游戏中移除,其硬币都会退还至银行。