it编程 > 编程语言 > C/C++

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

16人参与 2025-07-16 C/C++

c/c++ 中的 mdspan 介绍与使用

mdspan 是多维数组视图的一个现代 c++ 抽象,它是 c++23 标准引入的一个重要特性,旨在提供灵活、高效的多维数组操作方式。

什么是 mdspan

mdspan (multi-dimensional span) 是一个非拥有的多维数组视图,它:

基本用法

包含头文件

#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使用内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

您想发表意见!!点此发布评论

推荐阅读

基于QT编写一个网络调试助手

07-16

dubbo环境搭建ZooKeeper注册中心全过程

07-16

VScode中文乱码问题解决办法(C语言)

07-16

C++ 时间库duration 类的原理与复现(最新整理)

07-16

Alibaba Druid主要配置详解

07-14

C++项目中调用C#DLL的三种方式

07-14

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论