C ++ 23 Programlama Dili: Standartta başka ne ilginç

Adanali

Active member
C ++ 23 Programlama Dili: Standartta başka ne ilginç


  1. C ++ 23 Programlama Dili: Standartta başka ne ilginç

C ++ 23'ün bazı önemli özellikleri vardır, ancak ayrıntılara ilginç eklemeler de vardır.

Bir hatırlatma olarak: C ++ 23'ün en önemli özellikleri.













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.







En önemli C ++ 23 özellikleri


Bunun kesintisi ile C ++ 23, ana dilin küçük ama çok etkili bir özelliğini sunar. Bunu çıkartma, elin dolaylı olarak teslim edilen bir üye fonksiyonunun işlevinin tanımını açıkça yerine getirmesi için elle elle elle el ele geçirmesini sağlar. Bu türev sayesinde, C ++ 'da CRTP veya aşırı yük modeli gibi bazı karmaşık teknikler bir çocuk oyunu haline gelir.

C ++ 23 kütüphanesi birçok önemli ekleme alır. Standart kütüphane doğrudan olabilir import std; Konular veya c ++ 20 format halka std::print VE std::println başvurun. Ayrıca, performans nedenlerinden dolayı, std::flat_map. std::flap_map Bu bir düşüşün yerine geçmesi std::map. std::eek:ptional Uyumluluk nedeniyle monadik bir arayüz ile genişletilir. Yeni veri türü std::expected Zaten değiştirilebilir bir arayüze sahiptir ve hataların tedavisi için beklenen veya beklenmedik bir değerden tasarruf edebilir. Sayesinde std::mdspan Çok boyutlu bir aralık alıyoruz. std::generator Sonuçta, bir güç akışı üreten ilk beton koro. std::generator C ++ 23'te de gelişen aralıkların bir parçasıdır.

Önceki makalemde daha fazla ayrıntı mevcut:

Ana dil

  1. C ++ 23: Açık bölümlerin bu oluşturulmasını çıkarın
  2. C ++ 23: Bunun kesintisi ile sözdizimsel şeker
  3. C ++ 23: Ana dilde küçük inciler
  4. C ++ 23: Ana dilde daha küçük inciler
kütüphane

  1. C ++ 23: Modüler standart bir kütüphane ve iki yeni işlev
  2. Aralıklar: C ++ 23 ile iyileştirmeler
  3. C ++ 23: Std ::
  4. C ++ 23: Dört yeni ilişkisel kap
  5. C ++ 23: Multi -Emiss -Emiss -Scrostructions View
Ancak C ++ 23'ün sunduğu tek şey bu değil.

Katı genişliğe sahip akış kontrol türleri


Şimdiye kadar, C ++ aşağıdaki veri türlerini desteklemektedir:

  • Sonek yok: Çift
  • Fof sonek: şamandıra
  • L o l Sonek: Uzun çift
C ++ 23 beş yeni gerçek son ek getiriyor. CPPReference üzerindeki tablo, veri türlerini ve özelliklerini göstermektedir:








Yeni veri türleri başlıkta <stdfloat> tanımlanmış. Varsayılan bir makro ile, uygulamanız yeni veri türlerini destekliyorsa doğrulanabilir.

Stackrap


Mevcut yığının analizi genellikle problemleri çözmek için çok yararlıdır. Yeni Stacktrace-Bibilothk tam olarak bunu sunuyor.

Kütüphane iki sınıftan oluşur:

  • stacktrace_entry: Yığının izinde bir değerlendirmenin temsili
  • basic_stacktrace: Yığının tüm izinin veya belirli bir parçanın bir görüntüsü
Basit kelimelerle ifade edildi: sınıfla stacktrace_entry Yığının izinde bir değerlendirmede elde edilebilir. Her şey yolunda stacktrace_entry-Lot boştur veya yığın izinde bir değerlendirmeyi temsil eder.

Sınıf basic_stacktrace Yığının veya belirli bir parçanın tüm izinin bir anıdır.

Hala kafası karıştı mı?

Aşağıdaki basit örnekte, main İşlev işlevi func1 AÇIK, func1 çağrı func2 Sonraki ve İleri E func2 çağrı func3 AÇIK.


// stacktrace1.cpp&#13;
&#13;
#include <iostream>&#13;
#include <stacktrace>&#13;
&#13;
&#13;
void func3() {&#13;
std::cout << std::stacktrace::current() << 'n';&#13;
}&#13;
&#13;
void func2() {&#13;
func3();&#13;
}&#13;
&#13;
void func1() {&#13;
func2(); &#13;
}&#13;
&#13;
int main() {&#13;
func1();&#13;
}


func3 Statik işlevi arayın current AÇIK std::stacktrace AÇIK. std::stacktrace O bir takma ad std::basic_stacktrace Standart tahsisat ile.

Program, yürütme sırasında yığın izi hakkında bilgi sağlar.

Programın Explorer derleyicisi ile derlenmesi gerçek bir zorluktu. Doğru GCC versiyonunu ve kitapçıları bulmak biraz zaman aldı.

İşte G ++ 13.1 için komut satırı: g++ -std=c++23 -lstdc++_libbacktrace.

Sayesinde std::stacktrace_entry Yığının izi sorgulanabilir.


// stacktrace2.cpp&#13;
&#13;
#include <iostream>&#13;
#include <stacktrace>&#13;
&#13;
&#13;
void func3() {&#13;
auto stacktrace = std::stacktrace::current();&#13;
for (const auto& entry: stacktrace) {&#13;
std::cout << "Description: " << entry.description() << 'n';&#13;
std::cout << "file: " << entry.source_file() &#13;
<< " and line: " << entry.source_line() <<'n';&#13;
std::cout << 'n';&#13;
}&#13;
}&#13;
&#13;
void func2() {&#13;
func3();&#13;
}&#13;
&#13;
void func1() {&#13;
func2(); &#13;
}&#13;
&#13;
int main() {&#13;
func1();&#13;
}


İşlevde func3 Yığının iz söylentilerini gerçekleştirdim ve açıklamanızı, dosyalarınızı ve satırınızı açıkça gösterdim.

C ++ 23'ün diğer özellikleri hakkında sadece birkaç kelime yazacağım. Örnekler cppReference.com'dan geliyor.

Bir programın performansını etkileyebilecek iki özellik ile başlamak istiyorum.

Std :: ulaşılamaz


Yapabilirsiniz std::unreachable Ulaşılamayan kodu işaretlemek için kullanın. Tanımlanmamış davranış, STD :: Ulaşılamayan Çağrıya dönüşür.


// from https://en.cppreference.com/w/cpp/utility/unreachable&#13;
&#13;
switch (xy)&#13;
{&#13;
case 128: [[fallthrough]];&#13;
case 256: [[fallthrough]];&#13;
case 512: /* ... */&#13;
tex.clear();&#13;
tex.resize(xy * xy, Color{0, 0, 0, 0});&#13;
break;&#13;
default:&#13;
std::unreachable();&#13;
}


std::move_only_function


C ++ 11 ile var std::function. std::function Polimorfik fonksiyonel bir zarftır ve herhangi bir köpeği alıp onlara bir isim verebilir. Kanallar, işlevler, işlevsel nesneler veya lambdalar gibi işlevler gibi davranan varlıklardır.

Daha fazla std::function Burada bulabilirsiniz: TR1 ve C ++ 11'de fonksiyonel.

Aksine std::function Şekerler std::move_only_function Sadece yapılabilir bir callling alın. Çekilen nesne içinde olabilir std::move_only_function Daha fazla bellek gereksinimlerinden kaçınmak için kaydedilecek.


// from https://en.cppreference.com/w/cpp/utility/functional/move_only_function&#13;
&#13;
&#13;
auto lambda = [task = std::move(packaged_task)]() mutable { task(); };&#13;
&#13;
// std::function<void()> function = std::move(lambda); // Error&#13;
std::move_only_function<void()> function = std::move(lambda); // OK&#13;



std::byteswap


std::byteswap Bir değerle değiştirilen baytlar n. n ayrılmaz bir parça olmalıdır.

Aşağıdaki program çalışır std::byteswap İLE.


// from https://en.cppreference.com/w/cpp/numeric/byteswap&#13;
&#13;
#include <bit>&#13;
#include <concepts>&#13;
#include <cstdint>&#13;
#include <iomanip>&#13;
#include <iostream>&#13;
&#13;
template<std::integral T>&#13;
void dump(T v, char term = 'n')&#13;
{&#13;
std::cout << std::hex << std::uppercase << std::setfill('0')&#13;
<< std::setw(sizeof(T) * 2) << v << " : ";&#13;
for (std::size_t i{}; i != sizeof(T); ++i, v >>= 8)&#13;
std::cout << std::setw(2) &#13;
<< static_cast<unsigned>(T(0xFF) & v) << ' ';&#13;
std::cout << std::dec << term;&#13;
}&#13;
&#13;
int main()&#13;
{&#13;
static_assert(std::byteswap('a') == 'a');&#13;
&#13;
std::cout << "byteswap for U16:n";&#13;
constexpr auto x = std::uint16_t(0xCAFE);&#13;
dump(x);&#13;
dump(std::byteswap(x));&#13;
&#13;
std::cout << "nbyteswap for U32:n";&#13;
constexpr auto y = std::uint32_t(0xDEADBEEFu);&#13;
dump(y);&#13;
dump(std::byteswap(y));&#13;
&#13;
std::cout << "nbyteswap for U64:n";&#13;
constexpr auto z = std::uint64_t{0x0123456789ABCDEFull};&#13;
dump(z);&#13;
dump(std::byteswap(z));&#13;
}


Son olarak, program burada baskı.









Sırada ne var?



Bir sonraki makalemde C ++ 26'ya gidiyorum.


(RME)
 
Üst