C ++ 26'ya genel bir bakış: Ek kütüphane işlevleri ve rekabet
C ++ 26 kitapçısında rekabete dönmeden önce iki özellik vardır: aritmetik destek ve doygunluk çıkışları.
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.
Doygunluk aritmetiği
İngiliz Wikipedia sayfası, saritmetik tokluğunu aşağıdaki gibi açıklamaktadır: Satürn aritmetiği Tüm operasyonların, ek ve çarpma olarak araştırmaların, minimum ve maksimum değer arasındaki sabit bir aralıkla sınırlı olduğu bir aritmetik versiyonudur. Bir işlemin sonuçları maksimumdan daha yüksekse, maksimuma ayarlanır (“bloke edilir”); Minimumun altındaysa, minimumda bloke edilir. Ad, aşırı değerlere ulaştıktan sonra değerin “doymuş” haline gelmesinden kaynaklanır; Minimumdan maksimum veya çıkartmalara daha fazla ekleme, sonuçları değiştirmek istemez.
C ++ 26, tokluğun bir dizi aritmetik operasyonunu tanıttı: ilave, çıkarma, çarpma, bölünme ve doygunluğun dönüştürülmesi. Belirtilen tam tür, işlemin sonucunu temsil edemezse, sonuç bunun yerine std::numeric_limits::min<T>() VEYA std::numeric_limits::max<T>() (en yakın değere bağlı olarak).
CppReference.com'un bir açıklama ile güzel bir örneği var std::add_sat:
#include <climits>
#include <limits>
#include <numeric>
static_assert(CHAR_BIT == 8);
static_assert(UCHAR_MAX == 255);
int main()
{
constexpr int a = std::add_sat(3, 4); // no saturation occurs, T = int
static_assert(a == 7);
constexpr unsigned char b = std::add_sat<unsigned char>(UCHAR_MAX, 4); // saturated
static_assert(b == UCHAR_MAX);
constexpr unsigned char c = std::add_sat(UCHAR_MAX, 4); // not saturated, T = int
// add_sat(int, int) returns int tmp == 259,
// then assignment truncates 259 % 256 == 3
static_assert(c == 3);
// unsigned char d = std::add_sat(252, c); // Error: inconsistent deductions for T
constexpr unsigned char e = std::add_sat<unsigned char>(251, a); // saturated
static_assert(e == UCHAR_MAX);
// 251 is of type T = unsigned char, `a` is converted to unsigned char value;
// might yield an int -> unsigned char conversion warning for `a`
constexpr signed char f = std::add_sat<signed char>(-123, -3); // not saturated
static_assert(f == -126);
constexpr signed char g = std::add_sat<signed char>(-123, -13); // saturated
static_assert(g == std::numeric_limits<signed char>::min()); // g == -128
}
T, her iki işlevsel konunun veri türüdür:
template< class T >
constexpr T add_sat( T x, T y ) noexcept;
Hata Ayıklama Desteği
C ++ 26'nın hata ayıklama için üç işlevi vardır.
C ++ 26'daki rekabet baskın bir özelliğe sahiptir:
std::execution
std::executionDaha önce vericiler/alıcılar olarak belirtilmiş olan, genel kaynaklarda eşzamansız yürütmenin yönetimi için standart bir C ++ çerçevesi sunmaktadır (P2300R10). Üç temel unsuru vardır: programlar, vericiler ve alıcılar ve bir dizi özelleştirilebilir asenkron algoritma sunar.
P2300R10 teklifinin “Merhaba Dünya” programı şunları gösterir:
using namespace std::execution;
scheduler auto sch = thread_pool.scheduler(); // 1
sender auto begin = schedule(sch); // 2
sender auto hi = then(begin, []{ // 3
std::cout << "Hello world! Have an int."; // 3
return 13; // 3
}); // 3
sender auto add_42 = then(hi, [](int arg) { return arg + 42; }); // 4
auto = this_thread::sync_wait(add_42).value();
Örneğin açıklaması o kadar iyi ki doğrudan burada alıntı yapacağım:
Bu örnek, programların, gönderenlerin ve alınan programların temellerini gösterir:
Kopyalama Güncellemesini (RCU) ve Pointers Tehlikesi'ni okuyun
Kopyala Güncellemesi ve Tehlike İşaretçileri Okuyun Bloklar Olmayan Bir Yığın Gibi Bloklar Olmadan Veri Yapılarının Klasik Problemini Çözün: Bir iş parçacığı veri yapısının bir düğümünü güvenli bir şekilde ortadan kaldırabilirken, diğer iş parçacıkları bu düğümü aynı anda kullanabilir?
Bu yapılar çok özeldir ve bunları genel bir makalede tedavi etmek için çok fazla bilgiye ihtiyaç duyar.
Sırada ne var?
C ++ 26 aracılığıyla bir sonraki makalede dikkatimi değiştireceğim ve ayrıntılarla yüzleşeceğim.
(RME)
C ++ 26'ya genel bir bakış: Ek kütüphane işlevleri ve rekabet
C ++ 26 kitapçısında rekabete dönmeden önce iki özellik vardır: aritmetik destek ve doygunluk çıkışları.

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.

Doygunluk aritmetiği
İngiliz Wikipedia sayfası, saritmetik tokluğunu aşağıdaki gibi açıklamaktadır: Satürn aritmetiği Tüm operasyonların, ek ve çarpma olarak araştırmaların, minimum ve maksimum değer arasındaki sabit bir aralıkla sınırlı olduğu bir aritmetik versiyonudur. Bir işlemin sonuçları maksimumdan daha yüksekse, maksimuma ayarlanır (“bloke edilir”); Minimumun altındaysa, minimumda bloke edilir. Ad, aşırı değerlere ulaştıktan sonra değerin “doymuş” haline gelmesinden kaynaklanır; Minimumdan maksimum veya çıkartmalara daha fazla ekleme, sonuçları değiştirmek istemez.
C ++ 26, tokluğun bir dizi aritmetik operasyonunu tanıttı: ilave, çıkarma, çarpma, bölünme ve doygunluğun dönüştürülmesi. Belirtilen tam tür, işlemin sonucunu temsil edemezse, sonuç bunun yerine std::numeric_limits::min<T>() VEYA std::numeric_limits::max<T>() (en yakın değere bağlı olarak).
CppReference.com'un bir açıklama ile güzel bir örneği var std::add_sat:
#include <climits>
#include <limits>
#include <numeric>
static_assert(CHAR_BIT == 8);
static_assert(UCHAR_MAX == 255);
int main()
{
constexpr int a = std::add_sat(3, 4); // no saturation occurs, T = int
static_assert(a == 7);
constexpr unsigned char b = std::add_sat<unsigned char>(UCHAR_MAX, 4); // saturated
static_assert(b == UCHAR_MAX);
constexpr unsigned char c = std::add_sat(UCHAR_MAX, 4); // not saturated, T = int
// add_sat(int, int) returns int tmp == 259,
// then assignment truncates 259 % 256 == 3
static_assert(c == 3);
// unsigned char d = std::add_sat(252, c); // Error: inconsistent deductions for T
constexpr unsigned char e = std::add_sat<unsigned char>(251, a); // saturated
static_assert(e == UCHAR_MAX);
// 251 is of type T = unsigned char, `a` is converted to unsigned char value;
// might yield an int -> unsigned char conversion warning for `a`
constexpr signed char f = std::add_sat<signed char>(-123, -3); // not saturated
static_assert(f == -126);
constexpr signed char g = std::add_sat<signed char>(-123, -13); // saturated
static_assert(g == std::numeric_limits<signed char>::min()); // g == -128
}
T, her iki işlevsel konunun veri türüdür:
template< class T >
constexpr T add_sat( T x, T y ) noexcept;
Hata Ayıklama Desteği
C ++ 26'nın hata ayıklama için üç işlevi vardır.
- std::breakpoint Hata ayıklayıcıya çağrıldığında ve kontrol sunarken geçerli programı içerir,
- std::breakpoint_if_debugging çağrı std::breakpoint ne zaman std::is_debugger_present true Geri,
- std::is_debugger_present Bir hata ayıklayıcının kontrolü altında bir programın gerçekleştirilip gerçekleştirilmediğini kontrol edin.
C ++ 26'daki rekabet baskın bir özelliğe sahiptir:
std::execution
std::executionDaha önce vericiler/alıcılar olarak belirtilmiş olan, genel kaynaklarda eşzamansız yürütmenin yönetimi için standart bir C ++ çerçevesi sunmaktadır (P2300R10). Üç temel unsuru vardır: programlar, vericiler ve alıcılar ve bir dizi özelleştirilebilir asenkron algoritma sunar.
P2300R10 teklifinin “Merhaba Dünya” programı şunları gösterir:
using namespace std::execution;
scheduler auto sch = thread_pool.scheduler(); // 1
sender auto begin = schedule(sch); // 2
sender auto hi = then(begin, []{ // 3
std::cout << "Hello world! Have an int."; // 3
return 13; // 3
}); // 3
sender auto add_42 = then(hi, [](int arg) { return arg + 42; }); // 4
auto = this_thread::sync_wait(add_42).value();
Örneğin açıklaması o kadar iyi ki doğrudan burada alıntı yapacağım:
Bu örnek, programların, gönderenlerin ve alınan programların temellerini gösterir:
- Öncelikle bir zamanlayıcı almalıyız, iplik havuzunu arayın. Bir zamanlayıcı, yürütme kaynağı için bir ışık tutamağıdır.
- Bir zamanlayıcı üzerinde bir çalışma zinciri başlatmak için, zamanlayıcı üzerinde tamamlanan bir göndereni döndüren § 4.19.1 Execution :: Program olarak adlandırıyoruz. Bir gönderen eşzamansız çalışmayı tanımlar ve bu iş tamamlandığında bazı alıcılara bir sinyal (değer, hata veya tutuklama) gönderir.
- Gönderenler üretmek ve eşzamansız çalışma oluşturmak için düzenleyici algoritmalar kullanıyoruz. § 4.20.2 Yürütme :: Bu nedenle, giriş vericisi için gerektiren vericinin bir adaptörü ve bir std :: çağrılamaz ve giriş vericisi tarafından gönderilen sinyalde std :: çağrılabilir. İhraççı o zamandan beri geri döndü, bu çağrının sonucunu gönderiyor. Bu durumda, giriş gönderen programdan geldi, bu nedenle boşluğu, yani bize bir değer göndermeyeceği anlamına gelir, bu nedenle çağrılamamız parametreler almaz. Ancak bir sonraki alıcıya gönderilecek olan INT'ye geri dönelim.
- Şimdi § 4.20.2 :: So. Bu kez bize bir değer gönderilir: önceki adımdan itibaren INT. Ona 42 ekliyoruz ve sonuçları iade ediyoruz.
- Son olarak, tüm asenkron boru hattını sunmaya ve tamamlanmasını beklemeye hazırız. Bu noktaya kadar tamamen eşsizdi; İş henüz başlamamış olabilir. İşin başladığından ve dolayısıyla tamamlanmayı bekleyen engelleri engellemek için § 4.21.1'i kullanıyoruz. > Son gönderen tarafından gönderilen değer veya bir EMTY STD işareti ::: Kesilen bir sinyal veya hataya gönderilen son vericinin gönderilmesi durumunda bir istisna başlatır.
Kopyalama Güncellemesini (RCU) ve Pointers Tehlikesi'ni okuyun
Kopyala Güncellemesi ve Tehlike İşaretçileri Okuyun Bloklar Olmayan Bir Yığın Gibi Bloklar Olmadan Veri Yapılarının Klasik Problemini Çözün: Bir iş parçacığı veri yapısının bir düğümünü güvenli bir şekilde ortadan kaldırabilirken, diğer iş parçacıkları bu düğümü aynı anda kullanabilir?
Bu yapılar çok özeldir ve bunları genel bir makalede tedavi etmek için çok fazla bilgiye ihtiyaç duyar.
Sırada ne var?
C ++ 26 aracılığıyla bir sonraki makalede dikkatimi değiştireceğim ve ayrıntılarla yüzleşeceğim.
(RME)