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

 更新时间:2025年07月16日 09:56:42   作者:东北豆子哥  
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';
    }
}

优点

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

注意事项

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

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

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

相关文章

  • C++实现LeetCode(111.二叉树的最小深度)

    C++实现LeetCode(111.二叉树的最小深度)

    这篇文章主要介绍了C++实现LeetCode(111.二叉树的最小深度),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C语言实现顺序循环队列实例

    C语言实现顺序循环队列实例

    大家好,本篇文章主要讲的是C语言实现顺序循环队列实例,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • C语言写一个散列表

    C语言写一个散列表

    这篇文章主要介绍了C语言写一个散列表,散列表,就是下标可以为字母的数组。更多内容和小编一起学习下面内容吧
    2022-01-01
  • C++中this指针的理解与作用详解

    C++中this指针的理解与作用详解

    这篇文章主要给大家介绍了关于C++中this指针的理解与作用的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-12-12
  • C语言实现求最大公约数的三种方法

    C语言实现求最大公约数的三种方法

    最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。本文将为大家介绍三种方法来实现求解两个正整数的最大公约数,需要的可以参考一下
    2021-12-12
  • C/C++实现八大排序算法汇总

    C/C++实现八大排序算法汇总

    这篇文章主要为大家详细介绍了C/C++实现八大排序算法汇总,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • 理解C++编程中的std::function函数封装

    理解C++编程中的std::function函数封装

    这篇文章主要介绍了理解C++编程中的std::function函数封装,std::function是C++11标准中的新特性,需要的朋友可以参考下
    2016-04-04
  • C语言中K-means算法实现代码

    C语言中K-means算法实现代码

    这篇文章主要为大家详细介绍了C语言中K-means算法的实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • C语言实现十六进制转换为十进制的方法详解

    C语言实现十六进制转换为十进制的方法详解

    这篇文章主要为大家详细介绍了C语言实现十六进制转换为十进制的方法,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
    2022-11-11
  • C语言结构体中内存对齐的问题理解

    C语言结构体中内存对齐的问题理解

    内存对齐”应该是编译器的“管辖范围”。编译器为程序中的每个“数据单元”安排在适当的位置上。但是C语言的一个特点就是太灵活,太强大,它允许你干预“内存对齐”。如果你想了解更加底层的秘密,“内存对齐”对你就不应该再模糊了
    2022-02-02

最新评论