std::span提供安全高效的连续内存访问,避免拷贝和指针错误。它替代T*与size_t组合,统一处理数组、vector等容器,支持子视图切片与编译期大小检查,提升代码安全性与可读性。

在C++20中,std::span 是一种轻量级的非拥有式容器视图,用于安全、高效地访问连续内存中的元素序列。它不管理数据的生命周期,只提供对已有数组或容器(如 std::array、std::vector)的引用视图,避免不必要的拷贝。
std::span 的作用
std::span 主要用于替代传统的原始指针和长度参数组合(如 T* 和 size_t),提升代码的安全性和可读性。它的典型用途包括:
- 函数参数中传递数组或连续数据,避免退化为指针
- 统一处理不同类型的连续容器(vector、array、原生数组)
- 实现零成本抽象——没有运行时开销,仅封装指针与长度
例如,传统写法容易出错:
void process(int* arr, size_t len);使用 std::span 更清晰安全:
立即学习“C++免费学习笔记(深入)”;
void process(std::span基本用法示例
要使用 std::span,需包含头文件 (C++20 起支持):
#include#include
#include iostream>
创建 span 的常见方式:
std::vectorstd::span
std::span
int arr[] = {10, 20, 30};
std::span
std::span
访问元素:
for (const auto& elem : s1) {std::cout }
// 输出:1 2 3 4 5
高效访问技巧与子视图操作
std::span 支持快速切片(subspan),可在不复制数据的前提下提取部分视图,非常适合分段处理数据。
常用子视图方法:
-
s.first
() :取前 N 个元素的视图 -
s.last
() :取后 N 个元素的视图 - s.subspan(偏移, 长度):从中截取指定范围
std::vector
std::span
auto head = sp.first(); // {0,1,2}
auto tail = sp.last(); // {3,4,5,6}
auto mid = sp.subspan(2, 3); // {2,3,4}
这些操作都是常量时间完成,仅更新内部指针和长度,无内存拷贝。
静态与动态维度 span
std::span 可以指定元素类型和维度。第二个模板参数决定是否固定大小:
std::spanstd::span
固定大小的 span 能在编译期做更多检查,并允许隐式转换为更小的固定大小 span(如果匹配)。
例如,函数期望接收一个三个元素的数组:
void expect_triple(std::spanint arr[3] = {1,2,3};
expect_triple(arr); // OK:自动推导并匹配大小
这比使用裸指针更安全,能防止传入错误大小的数组。
基本上就这些。std::span 让你以现代 C++ 的方式安全高效地操作连续内存,减少错误,提升接口表达力。











