C++ дайджест #30: Contracts, Preconditions, Invariants, for_each для tuple
Привіт, мої любі сішники! В цьому випуску матеріали з Preconditions, об’єктів синхронізації, оптимізації та метапрограмування під MSVC.
Modern C++
std::index_sequence and its Improvement in C++20 — for_each для tuple на С++20 від Jonathan Boccara.
12 Different Ways to Filter Containers in Modern C++ — можливості фільтрування контейнерів через предикати з використанням С++20.
Contracts, Preconditions & Invariants — забезпечення цілісності «контрактів» (семантичного значення декларування функцій) за допомогою Preconditions та інваріантів.
Preconditions, Part 1, Part 2 — детальний огляд precondition від Herb Sutter: взаємозв’язок з асертами, як імплементувати в С++ 20 та більш ранніх стандартах.
Barriers and Atomic Smart Pointers in C++20 — можливості proposal N4162 до стандарту, у якому вводяться std::atomic_shared_ptr і std::atomic_weak_ptr, та відмінності std::latch від std::barrier.
std::jthread and cooperative cancellation with stop token — розглянуто std::jthread з std::stop_token.
Semaphores in C++20 — на прикладі розглянуто введений у С++ 20 std::binary_semaphore.
Корисні посилання
Серія статей Creating other types of synchronization objects that can be used with co await: частина 1 — The one-shot event, частина 2 — The basic library, частина 3 — Parallel resumption, частина 4 — The manual-reset event, частина 5 — The auto-reset event, частина 6 — The semaphore, частина 7 — The mutex and recursive, частина 8 — The shared mutex, частина 9 — The shared mutex (continued);
How C++ Resolves a Function Call — детальний опис, як не впасти у депресію, якщо вошлог заполонили помилки серії:
error C2666: 'String::operator ==': 2 overloads have similar conversions note: could be 'bool String::operator ==(const String &) const' note: or 'built-in C++ operator==(const char *, const char *)' note: while trying to match the argument list '(const String, const char *)'
Гарний огляд вибору певної функції компілятором і покроковий туторіал з подолання челенджу.
How to use C++ for Cross-Platform Development — швидке введення в використання С++ для написання кросплатформених застосунків на android/ios/win. Описано базову інтеграцію та взаємодію між мовами (Java (Android) / C++, Objective-C / C++, Swift / C++).
Job related results from the Meeting C++ community survey — статистика від Meeting C++.
Parameter Passing in C and C++ — що ховає під капотом вислів «передача параметрів» до рівня асемблеру.
Inlining and Compiler Optimizations — constant propagation та loop-invariant code motion.
Build Throughput Series: Template Metaprogramming Fundamentals та More Efficient Template Metaprogramming — спеціалізація та створення екземплярів шаблонів в MSVC та як оптимізувати час компіляції.
Інструменти
- PVS-Studio 7.12 New Features for Finding Safety and Security Threats
- Registries: Bring your own libraries to vcpkg
- Take control of your vcpkg dependencies with versioning support
- Complete C++20 Modules Support with GCC
- IntelliSense Improvements in Visual Studio 2019
- Cling — Beyond Just Interpreting C++
Хвилиночка флуду


4 коментарі
Додати коментар Підписатись на коментаріВідписатись від коментаріввот как отличный пример в продолжение темы аццкой кривости «современных проблем современного си++» тема за «classic LICM failure in practice: strlen» в это месте
wolchok.org/...d-compiler-optimizations
даётся код
#include <cctype> #include <cstring> bool isUpperCase(const char *s) { for (int ii = 0; ii < strlen(s); ++ii) { if (!isupper(s[ii])) { return false; } } return true; }но ожидается что условие в цикле ii < strlen(s); «будет оптимизировано до единоразового вызова» омг но почему кому это вообще пришло в голову и как по их мнению это вообще должно работать и что делать потом когда компилятор начнёт «оптимизировать» вызов который именно написан таким чтобы вызываться за каждым циклом а ну да давайте введём __attribute__((nolicm)) и сразу всем щасте и никто не уйдёт безнаказаным
хотя да эти рассуждения применимы для ranged for потому что там begin/end есть выражениями и из упрощённого синтаксиса (за что и боролись) всё не так однозначно где именно они будут вызваны
все эти современные «инженеры фхтанг» обладают общим качеством какой-то просто потрясающей бес полезностью
А чому воно не може бути оптимізоване?
Я б писав const char * const s;
первыйна собачке лайк остальное удоли ))
ЗЫ: тему с co_await synchronization objects читал многа думал ничо не понял с одной стороны кагбэ стандарт корутины вот это всё т.е. лично я предполагал раз стандард то просто берёшь готовое скаропки с другой стороны какая ацкая туча движений левой задней ногой в самодельной закате солнца вручную зачем? в этом месте я сильно больше понимаю гоферов и ко. которые смотрят на всё это большими большими глазами и не понимают и лично я тоже не понимаю как получается что большая часть modern c++ не направлена на решение каких-либо конкретных практических задач вот скажем тема Name Lookup отлично на это ложится смотришь в код видишь это ага давайте порешаем но стоп стоп стоп а зачем вообще так писать!? селяви селяплюсы ))
Не могли бы вы, пожалуйста расшифровать данный комментарий? Безумно интересно, но ничего не понятно.