Skip to content

std::span(C++20)

一句话

一种轻量级的非拥有视图,用于安全地引用一段连续内存,替代传统的指针加长度参数传递方式。

头文件

#include <span>

核心 API 速查

操作签名说明
构造template<class T, size_t E = dynamic_extent> class span模板类,支持静态或动态长度
获取指针T* data() const访问底层连续存储
元素个数size_t size() const返回元素数量
字节大小size_t size_bytes() const返回序列占用的字节数
是否为空bool empty() const检查序列是否为空
下标访问reference operator[](size_t idx) const访问指定元素(无边界检查)
首元素reference front() const访问第一个元素
末元素reference back() const访问最后一个元素
取前 N 个template<size_t C> constexpr span<element_type, C> first() const获取前 N 个元素的子视图
取子视图template<size_t O, size_t C> constexpr span<element_type, C> subspan() const获取指定偏移和长度的子视图

最小示例

cpp
// Standard: C++20
#include <iostream>
#include <span>

void print(std::span<const int> s) {
    for (int v : s) std::cout << v << ' ';
    std::cout << '\n';
}

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    std::span<int> s(arr);
    print(s);            // 1 2 3 4 5
    print(s.first(3));   // 1 2 3
    print(s.subspan(2)); // 3 4 5
}

嵌入式适用性:高

  • 零开销抽象:仅包含指针和长度(或编译期常量长度),无堆分配
  • 完美替代裸指针传参:统一数组、std::arraystd::vector 的接口,提升安全性
  • TriviallyCopyable 类型(C++23 起明确要求,此前主流实现已满足),可安全用于中断与 DMA 缓冲区操作
  • size_bytes()as_bytes() 极大简化硬件寄存器映射和底层字节级数据处理

编译器支持

GCCClangMSVC
待补充待补充待补充

另见


部分内容参考自 cppreference.com,采用 CC-BY-SA 4.0 许可

基于 VitePress 构建