C/C++ 中 mdspan 介绍与使用示例
作者:东北豆子哥
mdspan是C++23引入的多维数组视图,不管理内存仅提供视图,支持任意维度和灵活布局,适用于科学计算等领域,其优点包括零成本抽象、类型安全和可组合性,但需确保底层数据有效且编译器支持,本文介绍C/C++ 中 mdspan 介绍与使用,感兴趣的朋友一起看看吧
C/C++ 中的 mdspan 介绍与使用
mdspan 是多维数组视图的一个现代 C++ 抽象,它是 C++23 标准引入的一个重要特性,旨在提供灵活、高效的多维数组操作方式。
什么是 mdspan
mdspan (Multi-Dimensional Span) 是一个非拥有的多维数组视图,它:
- 不管理内存,只提供对现有数据的多维视图
- 支持任意维度的数组
- 提供灵活的内存布局描述
- 是 C++ 标准库的一部分 (C++23)
基本用法
包含头文件
#include <mdspan>
创建一个 mdspan
#include <mdspan>
#include <vector>
#include <iostream>
int main() {
std::vector<int> data = {1, 2, 3, 4, 5, 6};
// 创建一个 2x3 的 mdspan 视图
std::mdspan mat{data.data(), 2, 3};
// 访问元素
std::cout << mat(1, 2) << '\n'; // 输出 6
}高级特性
自定义布局
#include <mdspan>
int main() {
int data[6] = {1, 2, 3, 4, 5, 6};
// 使用行优先布局 (C风格)
std::mdspan mat_c{data, std::extents{2, 3}, std::layout_right{}};
// 使用列优先布局 (Fortran风格)
std::mdspan mat_f{data, std::extents{2, 3}, std::layout_left{}};
// 自定义跨步布局
std::mdspan mat_stride{data, std::extents{2, 3}, std::layout_stride{std::array{1, 2}}};
}动态与静态维度
#include <mdspan>
int main() {
int data[24];
// 完全静态维度
std::mdspan<int, std::extents<2, 3, 4>> static_span{data};
// 混合静态和动态维度
std::mdspan<int, std::extents<std::dynamic_extent, 3, std::dynamic_extent>> mixed_span{data, 2, 4};
// 完全动态维度
std::mdspan<int, std::extents<std::dynamic_extent, std::dynamic_extent>> dynamic_span{data, 2, 3};
}实际应用示例
矩阵乘法
#include <mdspan>
#include <vector>
#include <iostream>
template <typename T, typename ExtsA, typename LayA, typename AccA,
typename ExtsB, typename LayB, typename AccB,
typename ExtsC, typename LayC, typename AccC>
void matrix_multiply(
std::mdspan<T, ExtsA, LayA, AccA> a,
std::mdspan<T, ExtsB, LayB, AccB> b,
std::mdspan<T, ExtsC, LayC, AccC> c) {
for (size_t i = 0; i < c.extent(0); ++i) {
for (size_t j = 0; j < c.extent(1); ++j) {
c(i, j) = 0;
for (size_t k = 0; k < a.extent(1); ++k) {
c(i, j) += a(i, k) * b(k, j);
}
}
}
}
int main() {
std::vector<int> a_data(2*3, 1); // 2x3 矩阵,全1
std::vector<int> b_data(3*4, 2); // 3x4 矩阵,全2
std::vector<int> c_data(2*4); // 2x4 结果矩阵
auto a = std::mdspan(a_data.data(), 2, 3);
auto b = std::mdspan(b_data.data(), 3, 4);
auto c = std::mdspan(c_data.data(), 2, 4);
matrix_multiply(a, b, c);
// 输出结果
for (size_t i = 0; i < c.extent(0); ++i) {
for (size_t j = 0; j < c.extent(1); ++j) {
std::cout << c(i, j) << ' ';
}
std::cout << '\n';
}
}优点
- 零成本抽象:与原始指针操作性能相当
- 类型安全:比原始指针更安全
- 灵活性:支持多种内存布局
- 可组合性:可以与标准库其他组件良好配合
注意事项
mdspan不管理内存,只是视图- 需要确保底层数据在
mdspan使用期间有效 - C++23 特性,需要较新的编译器支持
mdspan 为 C++ 中的多维数组操作提供了现代化、高效的解决方案,特别适用于科学计算、图像处理等领域。
到此这篇关于C/C++ 中 mdspan 介绍与使用的文章就介绍到这了,更多相关c++ map使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
