C ++ 23: Çok boyutlu bir görünüm | Haberler Online
Bir Saat :: MDSPAN, tutarlı bir nesne bölümüne ait olmayan çok boyutlu bir vizyondur. Basit bir C dizisi, boyutta bir işaretçi olabilir, std::arrayA std::vector oa std::string davranmak.
Rainer Grimm yıllardır yazılım mimarı, ekip ve eğitim müdürü olarak çalıştı. C ++ programlama dilleri, Python ve Haskell hakkında makaleler yazmayı seviyor, ancak uzman konferanslarla konuşmayı da seviyor. Modern C ++ blogunda, C ++ tutkusuyla yoğun bir şekilde ilgileniyor.
Bu çok boyutlu görünüm genellikle çok boyutlu bir dizi olarak da bilinir.
Bireysel boyutun boyutu ve boyutu sayısı çok boyutlu dizinin şeklini belirler. Boyut sayısına sıralama (sıralama) ve boyutun her uzantısının boyutu (uzantı) denir. std::mdspan's Boyut, 0 olmayan her boyuttaki üründür. Birinin unsurlarında mümkündür std::mdspan Çok boyutlu dizin operatörü ile [] erişim.
A'nın her boyutu std::mdspan Bir Statik uzatma oa Dinamik uzatma Sahip olmak. Statik uzatma Bu, uzunluğunuzun derleme süresi boyunca belirlendiği anlamına gelir; Dinamik uzatma Bu, uzunluğunuzun sonunda belirlendiği anlamına gelir.
İşte bir tanımı std::mdspan:
template<
class T,
class Extents,
class LayoutPolicy = std::layout_right,
class AccessorPolicy = std::default_accessor<T>
> class mdspan;
C ++ 17'deki sınıf modeli (CTAG) konusunun kesintisi sayesinde, derleyici genellikle modelin konularını girişimlerin veri türlerinden otomatik olarak türetebilir:
// mdspan.cpp
#include <mdspan>
#include <iostream>
#include <vector>
int main() {
std::vector myVec{1, 2, 3, 4, 5, 6, 7, 8}; // (1)
std::mdspan m{myVec.data(), 2, 4}; // (2)
std::cout << "m.rank(): " << m.rank() << 'n'; // (4)
for (std::size_t i = 0; i < m.extent(0); ++i) { // (6)
for (std::size_t j = 0; j < m.extent(1); ++j) { // (7)
std::cout << m[i, j] << ' '; // (8)
}
std::cout << 'n';
}
std::cout << 'n';
std::mdspan m2{myVec.data(), 4, 2}; // (3)
std::cout << "m2.rank(): " << m2.rank() << 'n'; // (5)
for (std::size_t i = 0; i < m2.extent(0); ++i) {
for (std::size_t j = 0; j < m2.extent(1); ++j) {
std::cout << m2[i, j] << ' ';
}
std::cout << 'n';
}
}
Bu örnekte, sınıf modelinin konusunun çıkarımını üç kez kullanıyorum. (1) std::vector kullanılmış ve (2) ve (3) std::mdspan. İlk iki boyutlu dizi m Şekli var (2, 4), ikincisi m2 Şekle sahiptir (4, 2). (4) ve (5) içinde ikisinin safları std::mdspan görüntülenir. Her boyutun (6 ve 7) ve (8) 'deki dizin operatörünün genişlemesi sayesinde, çok boyutlu diziler yoluyla işlemek çok kolaydır.
Çok boyutlu bir dizi ise Statik uzatma Modelin konularına sahip olmalıdır.
// staticDynamicExtent.cpp
#include <mdspan>
#include <iostream>
#include <string>
#include <vector>
#include <tuple>
int main() {
std::vector myVec{1, 2, 3, 4, 5, 6, 7, 8};
std::mdspan<int, std::extents<std::size_t, 2, 4>>
m{myVec.data()}; // (1)
std::cout << "m.rank(): " << m.rank() << 'n';
for (std::size_t i = 0; i < m.extent(0); ++i) {
for (std::size_t j = 0; j < m.extent(1); ++j) {
std::cout << m[i, j] << ' ';
}
std::cout << 'n';
}
std::cout << 'n';
std::mdspan<int, std::extents<std::size_t, std::dynamic_extent,
std::dynamic_extent>> m2{myVec.data(), 4, 2};// (2)
std::cout << "m2.rank(): " << m2.rank() << 'n';
for (std::size_t i = 0; i < m2.extent(0); ++i) {
for (std::size_t j = 0; j < m2.extent(1); ++j) {
std::cout << m2[i, j] << ' ';
}
std::cout << 'n';
}
std::cout << 'n';
}
Program staticDynamicExtent.cpp Önceki programa dayanarak mdspan.cpp Ve aynı baskıyı yaratır. Fark şu ki std::mdspan m (1) Bir Statik uzatma Ha. Tamlık için: std::mdspan m2 (2) Bir tane var Dinamik GenişlerSonuç olarak m model konuları ile belirtilmiştir. m2 Ancak, işlevsel konularla.
Düzen stratejisi
A std::mdspan Temel belleğe erişim için düzen stratejisini belirtmenizi sağlar. Varsayılan olarak olur std::layout_right (Stil C, C ++ veya Python) kullanılır, ancak ayrıca std::layout_left (Fortren veya Matlab stili). Aşağıdaki grafik, unsurlarının std::mdspan Erişilebilir.
İki yarış std::mdspan Düzen stratejileri ile std::layout_right VE std::layout_left Farkı göster.
// mdspanLayout.cpp
#include <mdspan>
#include <iostream>
#include <vector>
int main() {
std::vector myVec{1, 2, 3, 4, 5, 6, 7, 8};
std::mdspan<int, std::extents<std::size_t, // (1)
std::dynamic_extent, std::dynamic_extent>,
std::layout_right> m{myVec.data(), 4, 2};
std::cout << "m.rank(): " << m.rank() << 'n';
for (std::size_t i = 0; i < m.extent(0); ++i) {
for (std::size_t j = 0; j < m.extent(1); ++j) {
std::cout << m[i, j] << ' ';
}
std::cout << 'n';
}
std::cout << 'n';
std::mdspan<int, std::extents<std::size_t, // (2)
std::dynamic_extent, std::dynamic_extent>,
std::layout_left> m2{myVec.data(), 4, 2};
std::cout << "m2.rank(): " << m2.rank() << 'n';
for (std::size_t i = 0; i < m2.extent(0); ++i) {
for (std::size_t j = 0; j < m2.extent(1); ++j) {
std::cout << m2[i, j] << ' ';
}
std::cout << 'n';
}
}
. std::mdspan m kullanılmış std::layout_right (1), diğeri std::mdspan std::layout_left (2). Sınıf modelinin konularının kesintisi sayesinde, üreticinin çağrısı std::mdspan (2) Açık model bir konu yok ve eşdeğer ifade ediliyor std::mdspan m2{myVec.data(), 4, 2}.
Program çıktısı iki farklı düzen stratejisini gösterir:
Aşağıdaki tablo, arayüz hakkında bir genel bakış sunmaktadır. std::mdspan md.
Sırada ne var?
C ++ 20 somut renkler sunmaz, ancak uygulanması için bir çerçeve sunar. Bu C ++ 23 ile değişir. std::generator İlk çimento koreroutin.
(RME)
Bir Saat :: MDSPAN, tutarlı bir nesne bölümüne ait olmayan çok boyutlu bir vizyondur. Basit bir C dizisi, boyutta bir işaretçi olabilir, std::arrayA std::vector oa std::string davranmak.

Rainer Grimm yıllardır yazılım mimarı, ekip ve eğitim müdürü olarak çalıştı. C ++ programlama dilleri, Python ve Haskell hakkında makaleler yazmayı seviyor, ancak uzman konferanslarla konuşmayı da seviyor. Modern C ++ blogunda, C ++ tutkusuyla yoğun bir şekilde ilgileniyor.

Bu çok boyutlu görünüm genellikle çok boyutlu bir dizi olarak da bilinir.
Bireysel boyutun boyutu ve boyutu sayısı çok boyutlu dizinin şeklini belirler. Boyut sayısına sıralama (sıralama) ve boyutun her uzantısının boyutu (uzantı) denir. std::mdspan's Boyut, 0 olmayan her boyuttaki üründür. Birinin unsurlarında mümkündür std::mdspan Çok boyutlu dizin operatörü ile [] erişim.
A'nın her boyutu std::mdspan Bir Statik uzatma oa Dinamik uzatma Sahip olmak. Statik uzatma Bu, uzunluğunuzun derleme süresi boyunca belirlendiği anlamına gelir; Dinamik uzatma Bu, uzunluğunuzun sonunda belirlendiği anlamına gelir.
İşte bir tanımı std::mdspan:
template<
class T,
class Extents,
class LayoutPolicy = std::layout_right,
class AccessorPolicy = std::default_accessor<T>
> class mdspan;
- T: Tutarlı nesne dizisi,
- Extents: boyut olarak boyut olarak belirtir; Her boyut bir olabilir Statik uzatma oa Dinamik uzatma Sahip olmak.
- LayoutPolicy: Aşağıdaki belleğe erişim için düzen yönergelerini algılar.
- AccessorPolicy: Altta yatan öğelere nasıl atıfta bulunulduğunu belirler.
C ++ 17'deki sınıf modeli (CTAG) konusunun kesintisi sayesinde, derleyici genellikle modelin konularını girişimlerin veri türlerinden otomatik olarak türetebilir:
// mdspan.cpp
#include <mdspan>
#include <iostream>
#include <vector>
int main() {
std::vector myVec{1, 2, 3, 4, 5, 6, 7, 8}; // (1)
std::mdspan m{myVec.data(), 2, 4}; // (2)
std::cout << "m.rank(): " << m.rank() << 'n'; // (4)
for (std::size_t i = 0; i < m.extent(0); ++i) { // (6)
for (std::size_t j = 0; j < m.extent(1); ++j) { // (7)
std::cout << m[i, j] << ' '; // (8)
}
std::cout << 'n';
}
std::cout << 'n';
std::mdspan m2{myVec.data(), 4, 2}; // (3)
std::cout << "m2.rank(): " << m2.rank() << 'n'; // (5)
for (std::size_t i = 0; i < m2.extent(0); ++i) {
for (std::size_t j = 0; j < m2.extent(1); ++j) {
std::cout << m2[i, j] << ' ';
}
std::cout << 'n';
}
}
Bu örnekte, sınıf modelinin konusunun çıkarımını üç kez kullanıyorum. (1) std::vector kullanılmış ve (2) ve (3) std::mdspan. İlk iki boyutlu dizi m Şekli var (2, 4), ikincisi m2 Şekle sahiptir (4, 2). (4) ve (5) içinde ikisinin safları std::mdspan görüntülenir. Her boyutun (6 ve 7) ve (8) 'deki dizin operatörünün genişlemesi sayesinde, çok boyutlu diziler yoluyla işlemek çok kolaydır.

Çok boyutlu bir dizi ise Statik uzatma Modelin konularına sahip olmalıdır.
// staticDynamicExtent.cpp
#include <mdspan>
#include <iostream>
#include <string>
#include <vector>
#include <tuple>
int main() {
std::vector myVec{1, 2, 3, 4, 5, 6, 7, 8};
std::mdspan<int, std::extents<std::size_t, 2, 4>>
m{myVec.data()}; // (1)
std::cout << "m.rank(): " << m.rank() << 'n';
for (std::size_t i = 0; i < m.extent(0); ++i) {
for (std::size_t j = 0; j < m.extent(1); ++j) {
std::cout << m[i, j] << ' ';
}
std::cout << 'n';
}
std::cout << 'n';
std::mdspan<int, std::extents<std::size_t, std::dynamic_extent,
std::dynamic_extent>> m2{myVec.data(), 4, 2};// (2)
std::cout << "m2.rank(): " << m2.rank() << 'n';
for (std::size_t i = 0; i < m2.extent(0); ++i) {
for (std::size_t j = 0; j < m2.extent(1); ++j) {
std::cout << m2[i, j] << ' ';
}
std::cout << 'n';
}
std::cout << 'n';
}
Program staticDynamicExtent.cpp Önceki programa dayanarak mdspan.cpp Ve aynı baskıyı yaratır. Fark şu ki std::mdspan m (1) Bir Statik uzatma Ha. Tamlık için: std::mdspan m2 (2) Bir tane var Dinamik GenişlerSonuç olarak m model konuları ile belirtilmiştir. m2 Ancak, işlevsel konularla.
Düzen stratejisi
A std::mdspan Temel belleğe erişim için düzen stratejisini belirtmenizi sağlar. Varsayılan olarak olur std::layout_right (Stil C, C ++ veya Python) kullanılır, ancak ayrıca std::layout_left (Fortren veya Matlab stili). Aşağıdaki grafik, unsurlarının std::mdspan Erişilebilir.

İki yarış std::mdspan Düzen stratejileri ile std::layout_right VE std::layout_left Farkı göster.
// mdspanLayout.cpp
#include <mdspan>
#include <iostream>
#include <vector>
int main() {
std::vector myVec{1, 2, 3, 4, 5, 6, 7, 8};
std::mdspan<int, std::extents<std::size_t, // (1)
std::dynamic_extent, std::dynamic_extent>,
std::layout_right> m{myVec.data(), 4, 2};
std::cout << "m.rank(): " << m.rank() << 'n';
for (std::size_t i = 0; i < m.extent(0); ++i) {
for (std::size_t j = 0; j < m.extent(1); ++j) {
std::cout << m[i, j] << ' ';
}
std::cout << 'n';
}
std::cout << 'n';
std::mdspan<int, std::extents<std::size_t, // (2)
std::dynamic_extent, std::dynamic_extent>,
std::layout_left> m2{myVec.data(), 4, 2};
std::cout << "m2.rank(): " << m2.rank() << 'n';
for (std::size_t i = 0; i < m2.extent(0); ++i) {
for (std::size_t j = 0; j < m2.extent(1); ++j) {
std::cout << m2[i, j] << ' ';
}
std::cout << 'n';
}
}
. std::mdspan m kullanılmış std::layout_right (1), diğeri std::mdspan std::layout_left (2). Sınıf modelinin konularının kesintisi sayesinde, üreticinin çağrısı std::mdspan (2) Açık model bir konu yok ve eşdeğer ifade ediliyor std::mdspan m2{myVec.data(), 4, 2}.
Program çıktısı iki farklı düzen stratejisini gösterir:

Aşağıdaki tablo, arayüz hakkında bir genel bakış sunmaktadır. std::mdspan md.

Sırada ne var?
C ++ 20 somut renkler sunmaz, ancak uygulanması için bir çerçeve sunar. Bu C ++ 23 ile değişir. std::generator İlk çimento koreroutin.
(RME)