Привет, Хабр! Сегодня я хочу вам представить подборку интересных новостей и материалов по C++ за последнюю неделю.
Приятного чтения!
? Статьи
Understanding the inner workings of C++ smart pointers - The shared_ptr — вам всегда было интересно, как устроен
std::shared_ptr
(cppreference) изнутри? Статья предлагает разбор минималистичной, но вполне себе полноценной его реализации.What’s new in C++26 (part 1) — Обзор свежепринятых в C++26 новинок: переменные-плейсхолдеры (cppreference), форматированные строки в
static_assert
и другое.
// Разве это не прекрасно, что мы можем написать так и на
// нас не будет ругаться компилятор?
auto [data, _] = get_data();
// И мы можем повторить этот _ в одной области видимости
// много раз!
auto [ptr, _] = std::to_chars(p, last, 42);
// Да, мы не могли использовать std::format в static_assert
// до C++26
static_assert(sizeof(int) == 4, std::format("Expected 4, actual {}", sizeof(int)));
An Overview of C++26: The Library — Если предыдущая статья обозревает исключительно изменения в самом языке, то в этой статье речь идет об изменениях в стандартной библиотеке:
std::string_view
(cppreference) продолжают делать всё более и более полезным, ranges продолжают допиливать, а количество контейнеров в стандартной библиотеке всё продолжает увеличиваться:
// Динамически-расширяемый вектор с фиксированным
// capacity заказывали?
std::inplace_vector<int, 2> vec;
vec.push_back(1); // OK
vec.push_back(2); // OK
vec.push_back(3); // std::bad_alloc! Место на стеке закончилось!
Structs and constructors — Структуры и конструкторы: нужно ли одно другим, или агрегатной инициализации хватит всем?
Reader Q&A: What’s the best way to pass an istream parameter? — Знаток (Герб Саттер, председатель WG21) отвечает на вопрос: как лучше всего принять в функцию
std::istream
(cppreference)? Спойлер:
Скрытый текст
template <typename S>
void add_from_stream( S&& s )
requires std::is_convertible_v<S, std::istream const&>
{
// do work + remember to use s as "std::forward<S>(s)"
}
Synchronization Primitives in C++20 — Возвращаясь от мечт о прекрасном будущем (C++26) к реальности (C++20, если вам повезло): о
std::latch
(cppreference) иstd::barrier
(cppreference).Compressing floating-point numbers quickly by converting them to brain floats — Не хватает памяти на большие объемы
double
-ов? Как насчет того, чтобы сжать их до 16 бит (bfloat16)?
? Видео и доклады
C++ Weekly - Ep 444 - GCC's Implicit constexpr — Обзор расширения GCC (GCC docs), делающего все
inline
функции в вашем кодеconstexpr
, если они удовлетворяют всем требованиямconstexpr
-функций.
Дайджест составлен и опубликован при поддержке московского сообщества программистов C++ Moscow
Заметили ошибку или опечатку? Сообщите в личку (Telegram, Habr)
Прислать ссылку можно через форму обратной связи или просто написав мне в личные сообщения (Telegram, Habr)
← Предыдущий выпуск: C++ Дайджест №7
domix32
Интересно было бы узнать, а для чего это может пригодиться. Гугловые bfloat-то использовались в нейронках и там в принципе не имело смысло использовать double из-за сходимости, что несколько ускоряло обучение, а вот чтобы имеющиеся double пожать - зачем?
Melirius
Бывает, например, результаты 3D симуляции могут терабайты занимать.
domix32
Для научных и вероятно для инженерных симуляций обычно требуется некоторая заданная точность и сжимать данные с погрешностями кажется нельзя. Для развесовки нейронок как писал выше можно сразу использовать короткие флоты. А какие симуляции могут занимать столько места вне этих категорий пока не представляю.
slupoke
Предположу, что есть случаи, когда допустима погрешность финального результата. Т.е. есть какие-то этапы или промежуточные расчеты, которые используют double для точности, но под конец приводятся в bfloat.
Melirius
Там когда как. Я вот про симуляции слияний чёрных дыр и нейтронных звёзд знаю, что там каждый шаг хранить очень накладно, но и считать тоже, поэтому сохраняют в полной точности раз в N шагов, а промежуточные жмут для хранения до низкой.