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++中的namespace用法

    你真的懂C++中的namespace用法

    命名空间(namespace)为防止名字冲突提供了更加可控的机制,命名空间分割了全局命名空间,其中每个命名空间是一个作用域,今天通过本文给大家分享C++中namespace用法,感兴趣的朋友一起看看吧
    2021-06-06
  • 详解C++赋值操作符重载

    详解C++赋值操作符重载

    这篇文章主要介绍了C++赋值操作符重载的相关资料,帮助大家更好的理解和学习c++,感兴趣的朋友可以了解下
    2020-08-08
  • OpenCV绘制正多边形的方法

    OpenCV绘制正多边形的方法

    这篇文章主要为大家详细介绍了OpenCV绘制正多边形的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • C语言中`||`的短路机制详解

    C语言中`||`的短路机制详解

    在C语言中,逻辑或运算符(||)是一种常用的逻辑运算符,用于组合多个条件表达式,C语言中的逻辑或运算符具有短路机制,这是一种非常重要的概念,本文将深入解释C语言中的||短路机制以及其在编程中的应用,感兴趣的朋友跟随小编一起看看吧
    2024-01-01
  • C/C++中*和&的用法详解

    C/C++中*和&的用法详解

    在本篇文章中我们给大家总结了C/C++中*和&的用法以及相关的代码分享,有兴趣的朋友赶紧学习下吧。
    2018-03-03
  • C语言中的直接插入排序(带图详细)

    C语言中的直接插入排序(带图详细)

    这篇文章主要介绍了C语言中的直接插入排序(带图详细),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • 使用C语言实现交换整数的奇数位和偶数位

    使用C语言实现交换整数的奇数位和偶数位

    在C语言中,要交换一个整数的二进制位中的奇数位和偶数位,重点需要理解位操作,当我们谈论二进制位的奇数位和偶数位时,我们是指从右到左数的位置,本文给大家介绍了使用C语言代码实现将一个整数的奇数位和偶数位交换,需要的朋友可以参考下
    2025-03-03
  • C语言实现大整数加减运算详解

    C语言实现大整数加减运算详解

    大数运算,顾名思义,就是很大的数值的数进行一系列的运算。本文通过实例演示如何进行C语言中的大整数加减运算,有需要的可以参考借鉴。
    2016-08-08
  • C语言求解定积分的方法

    C语言求解定积分的方法

    这篇文章主要为大家详细介绍了C语言求解定积分的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • Unity3D实现经典小游戏Pacman

    Unity3D实现经典小游戏Pacman

    这篇文章主要介绍了基于Unity3D制作一做个经典小游戏Pacman,文中的示例代码讲解详细,对我们学习Unity3D有一定的帮助,感兴趣的小伙伴可以了解一下
    2021-12-12

最新评论