C/C++ 中 mdspan 介紹與使用示例
  更新時間:2025年07月16日 09:56:42   作者:東北豆子哥   
                        mdspan是C++23引入的多維數(shù)組視圖,不管理內存僅提供視圖,支持任意維度和靈活布局,適用于科學計算等領域,其優(yōu)點包括零成本抽象、類型安全和可組合性,但需確保底層數(shù)據(jù)有效且編譯器支持,本文介紹C/C++ 中 mdspan 介紹與使用,感興趣的朋友一起看看吧
                        C/C++ 中的 mdspan 介紹與使用
mdspan 是多維數(shù)組視圖的一個現(xiàn)代 C++ 抽象,它是 C++23 標準引入的一個重要特性,旨在提供靈活、高效的多維數(shù)組操作方式。
什么是 mdspan
mdspan (Multi-Dimensional Span) 是一個非擁有的多維數(shù)組視圖,它:
- 不管理內存,只提供對現(xiàn)有數(shù)據(jù)的多維視圖
 - 支持任意維度的數(shù)組
 - 提供靈活的內存布局描述
 - 是 C++ 標準庫的一部分 (C++23)
 
基本用法
包含頭文件
#include <mdspan>
創(chuàng)建一個 mdspan
#include <mdspan>
#include <vector>
#include <iostream>
int main() {
    std::vector<int> data = {1, 2, 3, 4, 5, 6};
    // 創(chuàng)建一個 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};
    // 使用行優(yōu)先布局 (C風格)
    std::mdspan mat_c{data, std::extents{2, 3}, std::layout_right{}};
    // 使用列優(yōu)先布局 (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}}};
}動態(tài)與靜態(tài)維度
#include <mdspan>
int main() {
    int data[24];
    // 完全靜態(tài)維度
    std::mdspan<int, std::extents<2, 3, 4>> static_span{data};
    // 混合靜態(tài)和動態(tài)維度
    std::mdspan<int, std::extents<std::dynamic_extent, 3, std::dynamic_extent>> mixed_span{data, 2, 4};
    // 完全動態(tài)維度
    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';
    }
}優(yōu)點
- 零成本抽象:與原始指針操作性能相當
 - 類型安全:比原始指針更安全
 - 靈活性:支持多種內存布局
 - 可組合性:可以與標準庫其他組件良好配合
 
注意事項
mdspan不管理內存,只是視圖- 需要確保底層數(shù)據(jù)在 
mdspan使用期間有效 - C++23 特性,需要較新的編譯器支持
 
mdspan 為 C++ 中的多維數(shù)組操作提供了現(xiàn)代化、高效的解決方案,特別適用于科學計算、圖像處理等領域。
到此這篇關于C/C++ 中 mdspan 介紹與使用的文章就介紹到這了,更多相關c++ map使用內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
 C++實現(xiàn)LeetCode(111.二叉樹的最小深度)
這篇文章主要介紹了C++實現(xiàn)LeetCode(111.二叉樹的最小深度),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下2021-07-07
 理解C++編程中的std::function函數(shù)封裝
這篇文章主要介紹了理解C++編程中的std::function函數(shù)封裝,std::function是C++11標準中的新特性,需要的朋友可以參考下2016-04-04

