Привет, Хабр! Сегодня я хочу вам представить подборку интересных новостей и материалов по C++ за последнюю неделю.

Приятного чтения!

? Статьи

  1. Understanding the inner workings of C++ smart pointers - The shared_ptr — вам всегда было интересно, как устроен std::shared_ptr (cppreference) изнутри? Статья предлагает разбор минималистичной, но вполне себе полноценной его реализации.

  2. 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)));
  1. 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! Место на стеке закончилось!
  1. Structs and constructors — Структуры и конструкторы: нужно ли одно другим, или агрегатной инициализации хватит всем?

  2. 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)"
}

  1. Synchronization Primitives in C++20 — Возвращаясь от мечт о прекрасном будущем (C++26) к реальности (C++20, если вам повезло): о std::latch (cppreference) и std::barrier (cppreference).

  2. Compressing floating-point numbers quickly by converting them to brain floats — Не хватает памяти на большие объемы double-ов? Как насчет того, чтобы сжать их до 16 бит (bfloat16)?

? Видео и доклады

  1. C++ Weekly - Ep 444 - GCC's Implicit constexpr — Обзор расширения GCC (GCC docs), делающего все inline функции в вашем коде constexpr, если они удовлетворяют всем требованиям constexpr-функций.

Дайджест составлен и опубликован при поддержке московского сообщества программистов C++ Moscow

Заметили ошибку или опечатку? Сообщите в личку (Telegram, Habr)

Прислать ссылку можно через форму обратной связи или просто написав мне в личные сообщения (Telegram, Habr)

← Предыдущий выпуск: C++ Дайджест №7

Комментарии (6)


  1. domix32
    10.09.2024 13:28

    Compressing floating-point numbers quickly by converting them to brain floats — Не хватает памяти на большие объемы double-ов? Как насчет того, чтобы сжать их до 16 бит (bfloat16)?

    Интересно было бы узнать, а для чего это может пригодиться. Гугловые bfloat-то использовались в нейронках и там в принципе не имело смысло использовать double из-за сходимости, что несколько ускоряло обучение, а вот чтобы имеющиеся double пожать - зачем?


    1. Melirius
      10.09.2024 13:28

      Бывает, например, результаты 3D симуляции могут терабайты занимать.


      1. domix32
        10.09.2024 13:28

        Для научных и вероятно для инженерных симуляций обычно требуется некоторая заданная точность и сжимать данные с погрешностями кажется нельзя. Для развесовки нейронок как писал выше можно сразу использовать короткие флоты. А какие симуляции могут занимать столько места вне этих категорий пока не представляю.


        1. slupoke
          10.09.2024 13:28

          Предположу, что есть случаи, когда допустима погрешность финального результата. Т.е. есть какие-то этапы или промежуточные расчеты, которые используют double для точности, но под конец приводятся в bfloat.


        1. Melirius
          10.09.2024 13:28

          Там когда как. Я вот про симуляции слияний чёрных дыр и нейтронных звёзд знаю, что там каждый шаг хранить очень накладно, но и считать тоже, поэтому сохраняют в полной точности раз в N шагов, а промежуточные жмут для хранения до низкой.


  1. Nimble_Fox
    10.09.2024 13:28

    А для java подобная статья имеется? Ну Или C#