Pull to refresh
390.87
Яндекс
Как мы делаем Яндекс

Что приняли в C++17, фотография Бьярне Страуструпа и опрос для C++20

Reading time 4 min
Views 53K

В начале марта в американском городе Кона завершилась встреча международной рабочей группы WG21 по стандартизации C++ в которой участвовали сотрудники Яндекса.
C++17 "приняли"!
Если быть совсем точным, решили, что пора передавать документ-черновик С++17 в вышестоящий орган ISO, который выпустит его в качестве стандарта, либо отправит обратно для исправления форматирования и некоторых других формальностей.

Заседания, как обычно, занимали целый день плюс дополнительно заседала подгруппа по работе с числами.

Основное время было посвящено полировке черновика C++17, но несколько небольших и интересных нововведений все же успели проскочить в C++17.


20 лет ждали...


std::ofstream(L"Теперь можно открывать файлы с юникодными именами.txt") << u8"Ура!";


std::optional и сравнения


Операторы сравнения для класса std::optional до последнего дня были описаны как:
template <class T>
bool operator < (const optional<T>&, const T&);
// ...

Что вызывало ошибки компиляции в ряде случаев:

optional<const int> x = 42;
int y = 666;
x == y; // не скомпилируется
...

optional<string> s = "Hello";
s == "Hello"; // не скомпилируется


В Коне эта проблема была исправлена, операторы сравнения приобрели следующий вид:
template <class T, class U>
bool operator < (const optional<T>&, const U&);
// ...

Так что теперь все вышеприведённые примеры будут компилироваться, а сравнение 's == «Hello»' будет работать без создания временного объекта строки.

Deduction guides


Было добавлено множество явных deduction guides, так что теперь следующий код будет собираться:

// Ура! Можно не писать шаблонные параметры.
std::tuple      a = {42, "Hello", 3.14};
std::array      b = {1, 2, 3, 4, 5, 6, 7, 8};
std::pair       c = {42, "Hello"};
std::function   d = [](int i) { std::cout << i; };
std::set        e = {1, 2, 3, 4, 5, 6, 7, 8};

// P.S.: В примерах выше знак '=' тоже можно не писать :)


История успеха std::array
В первоначальной бумаге по интеграции explicit deduction guides в стандартную библиотеку не присутствовал класс std::array.

Но так как этот класс любимый у одного из представителей России в WG21 C++, то мы закатали рукава, вооружились последними компиляторами, написали и оттестировали explicit deduction guides для std::array. После чего результат трудов выслали автору предложения, пообщались с ним в кулуарах и… вуаля!


std::byte


Кого-нибудь смущало, что когда нам нужен массив байт для хранения каких-то бинарных данных у мы заводили «массив беззнаковых букв»? C С++17 у нас будет тип данных std::byte и теперь вместо
unsigned char raw_buffer[buffer_size];
можно писать
std::byte raw_buffer[buffer_size];
.

Мелочи, делающие код компактнее и портабельнее


Множество небольших улучшений было внесено повсеместно в стандарт. Так например:
  • std::filesystem::path был подкручен для того, чтобы он мог корректно работать на платформах, отличных от Windows и POSIX (например, на zOS).
  • std::filesystem::directory_entry научился кешировать информацию от ОС и обходиться одним системным вызовом там, где раньше требовалось 2.
  • std::hash для большинства случаев теперь помечен как noexcept, что сделает размер ваших бинарников меньше (при условии, что вы пользуетесь unordered_* контейнерами).
  • Текст описывающий std::atomic_* функции был сильно переработан, теперь код
    long example(atomic<long> * a) { return atomic_fetch_add(a, 42); }
    гарантированно работает на всех имплементациях.
  • Все переменные-теги и шаблонные переменные были помечены как inline, что устраняет проблемы с потенциальным нарушением ODR. Другими словами, объём и производительность вашего код будут менее зависимы от линкера, работа линкера упростится.


Обсуждения и идеи


Как всегда, несколько подгрупп внутри комитета С++ работали одновременно. Некоторые подгруппы успели разобраться с задачами связанными с C++17, и приступили к продумыванию идей для C++20. Ниже расскажу о некоторых самых интересных обсуждениях.

Numbers TS


Если вы занимаетесь точными науками, разрабатываете сверхнадёжные приложения, участвуете в олимпиадах по программированию, ведете финансовые рассчёты или работаете с огромными числами, то у меня есть для вас хорошие новости. Сформировались планы по выпуску Numbers TS — набора различных классов для разнообразнейшей работы с числами. Вот некоторые кандидаты:
  • wide float — числа с плавающей точкой, где количество машинных слов под хранение числа задаётся на этапе компиляции;
  • wide integers (на основе предложения с stdcpp.ru) — целые числа, где количество машинных слов под хранение числа задаётся на этапе компиляции;
  • unbounded floats — числа с плавающей точкой, способные хранить число любой размерности и динамически аллоцирующие память по мере необходимости;
  • unbounded integers — целые числа, способные хранить число любой размерности и динамически аллоцирующие память по мере необходимости;
  • rational — дробные числа;
  • safe numbers — обертки над числами, гарантирующие отсутствие UB на этапе компиляции, либо проверяющие переполнения и UB на рантайме;
  • decimal;
  • small float.

Планы амбициозные, ждать придётся достаточно долго.

operator<=>()


Обсудили operator<=>(). Решено продолжать проработку этого оператора, есть все шансы что к C++20 можно будет писать:
struct foo { /* очень много различных полей */ };

auto operator<=>(const foo&, const foo&) = default; // Сгенерирует все компараторы для сравнения foo c foo
auto operator<=>(const foo&, const char*) = default; // Сгенерирует все компараторы для сравнения foo c const char* и все компараторы для сравнения const char* с foo


Остальное


А еще обсуждали модули, корутины/сопрограммы/«Гор-рутины», контракты, constexpr и constexpr контейнеры, constexpr аллокацию «в куче», плагины и динамическую загрузку библиотек, крутые оптимизации для стандартных контейнеров и много другое. Рассказать всё в одном посте не получится, поэтому мы в РГ 21 планируем небольшую встречу, на которой расскажем о будущем С++ и о С++17 поподробнее. Так же на встрече будет выступать Гор Нишанов — автор корутин для WG21 C++.

Итоги и опрос


C++17 на подходе, ура!

Если у вас есть идеи для C++20, вы нашли проблемы в C++17/C++14/C++11, или просто хотите подстегнуть разработку той или иной фичи C++, то заходите на сайт рабочей группы stdcpp.ru. Добро пожаловать!

Внимание! Некоторым подгруппам международного комитета С++ нужно получить информацию о том, что разработчикам интересно и чем разработчики пользуются, чтобы лучше расставить свои приоритеты.
Only registered users can participate in poll. Log in, please.
Итак, вот мини опрос:
51.05% Можно научить контейнеры доставать информацию о действительном размере выделенного куска памяти из аллокатора, что сделает контейнеры стандартной библиотеки более производительными и менее затратными по памяти (например в тесте вот тут получили 15% прирост производительности при вставке в вектор). Вам эта разработка интересна? 195
40.84% Используете ли вы в компании, или в своих личных проектах, плагины/динамическую-загрузку-библиотек? Опишите в комментариях, какими функциями и классами вы для этого пользуетесь? 156
14.14% Используете ли вы в компании, или в своих личных проектах, классы способные хранить числа произвольной длинны (unbounded integers) с нестандартными аллокаторами? 54
6.28% Применяете ли вы один нестандартный аллокатор для всего бинарника целиком (вместо использования специфичного аллокатор именно для unbounded integers)? 24
2.36% Переопределяете ли вы в аллокаторе для unbounded integers тип pointer на имитирующий поведение указателя класс? 9
67.8% Вам нужны модули, не экспоритрующие макросы и максимально быстрые при компиляции? 259
38.48% Вам нужны модули, экспоритрующие макросы и позволяющие с большей лёгкостью переносить старый код на модули? 147
382 users voted. 274 users abstained.
Tags:
Hubs:
+74
Comments 315
Comments Comments 315

Articles

Information

Website
www.ya.ru
Registered
Founded
Employees
over 10,000 employees
Location
Россия
Representative