欢迎来到徐庆高(Tea)的个人博客网站
磨难很爱我,一度将我连根拔起。从惊慌失措到心力交瘁,我孤身一人,但并不孤独无依。依赖那些依赖我的人,信任那些信任我的人,帮助那些给予我帮助的人。如果我愿意,可以分裂成无数面镜子,让他们看见我,就像看见自己。察言观色和模仿学习是我的领域。像每个深受创伤的人那样,最终,我学会了随遇而安。
当前位置: 日志文章 > 详细内容

C/C++ 中 mdspan 介绍与使用示例

2025年07月16日 C/C++
c/c++ 中的 mdspan 介绍与使用mdspan 是多维数组视图的一个现代 c++ 抽象,它是 c++23 标准引入的一个重要特性,旨在提供灵活、高效的多维数组操作方式。什么是 mdspanmd

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';
    }
}

优点

  1. 零成本抽象:与原始指针操作性能相当
  2. 类型安全:比原始指针更安全
  3. 灵活性:支持多种内存布局
  4. 可组合性:可以与标准库其他组件良好配合

注意事项

  1. mdspan 不管理内存,只是视图
  2. 需要确保底层数据在 mdspan 使用期间有效
  3. c++23 特性,需要较新的编译器支持

mdspan 为 c++ 中的多维数组操作提供了现代化、高效的解决方案,特别适用于科学计算、图像处理等领域。

到此这篇关于c/c++ 中 mdspan 介绍与使用的文章就介绍到这了,更多相关c++ map使用内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!