std::span可以直接操作一段连续内存的数据,零拷贝。测试下:
cpp
static void print_data(std::span<int> data) {
for (int val : data) {
std::cout << val << " ";
}
std::cout << std::endl;
}
void testSpan(void) {
int c_arr[] = {1527, 1314520};
print_data(c_arr); // 自动从数组构造 span
std::vector<int> vec = {520, 996};
print_data(vec); // 自动从 vector 构造 span
std::span<int> span(vec);
std::span<int> sub = span.subspan(1, 2);
print_data(sub);
sub[0] = 98; // 把996改为了98
print_data(vec);
}
运行:

ok. 有个小问题, print_data(sub) 这句代码打印:996 1541734736 , 第2个值是垃圾值。 因为前面std::span<int> sub = span.subspan(1, 2); 这句代码意思是从下标1开始,向后取2个元素。而实际上下标1后面没有元素了,取的是垃圾值。修改下代码,只取一个元素:
cpp
void testSpan(void) {
int c_arr[] = {1527, 1314520};
print_data(c_arr); // 自动从数组构造 span
std::vector<int> vec = {520, 996};
print_data(vec); // 自动从 vector 构造 span
std::span<int> span(vec);
std::span<int> sub = span.subspan(1, 1); // {996} , 对应原数组索引1处的数
print_data(sub);
sub[0] = 98; // 把996改为了98
print_data(vec);
}
打印:

ok.