Pull to refresh

Обзор новых возможностей С++14: Часть 2

Reading time 5 min
Views 67K
На этот раз нововведений гораздо меньше, чем в первой части. Все-таки С++14 считается незначительным релизом, нацеленным скорее на устранение недочетов С++11, чем привнесение новых возможностей.

Краткий перечень:
  • Освобождение памяти определенного размера
  • Одинарная кавычка, как цифровой разделитель
  • Аттрибут [[deprecated]]
  • Пользовательские литералы для std::complex
  • Filesystem API
  • Преобразование сетевого порядка байт

Обзор новых возможностей С++14: Часть 1
Текущий черновик стандарта


Изменения в самом языке


Освобождение памяти определенного размера


В C++11 программисты могут определить статический метод класса operator delete, который бы принимал параметром размер удалямого объекта. Теперь же в стандарт был добавлен соответствующий глобальный оператор delete. Это изменение призвано повысить производительность современных распределителей памяти.

Добавленные операторы имеют следующие сигнатуры:
void operator delete(void* ptr, std::size_t size) noexcept;
void operator delete(void* ptr, std::size_t size, const std::nothrow_t&) noexcept;
void operator delete[](void* ptr, std::size_t size) noexcept;
void operator delete[](void* ptr, std::size_t size, const std::nothrow_t&) noexcept;

Основной возникшей здесь проблемой совместимости является случай, когда используются новая системная и старая пользовательская библиотеки распределения памяти. В новых программах, вызовы к оператору, не принимающему размер, будут направляться в пользовательскую библиотеку, а вызовы с размером — в системную библиотеку. На данный момент, стандартное поведение операторов с размером — это вызов соответствующих операторов без размера, поэтому проблем пока не будет, а пользователям, желающим получить прирост приозводительности, необходимо будет добавить соответствующие версии операторов самим. Однако в будущих версиях стандарта планируется изменить это поведение. Таким образом, комитет дает программистам время адаптировать их распределители памяти, во избежание неожиданно возникших проблем.

Одинарная кавычка, как цифровой разделитель


Теперь можно будет использовать одинарные кавычки для обособления порядков чисел. Например, числа 1048576, 1'048'576, 1'0'4'8'5'7'6, 0X100000, 0x10'0000, и 0'004'000'000 имеют одно и тоже значение.
Однако это изменение приводит к следующим проблемам:
Во-первых, изменяется поведение расширения макросов. Например:
#define M(x, ...) __VA_ARGS__
int x[2] = { M(1'2,3'4) }; 
 // C++11: int x[2] = {};
 // Now:   int x[2] = { 3'4 };

А во-вторых, множество редакторов и других утилит, предназначенных для подсветки синтаксиса, будут теперь неправильно парсить код. Даже Хабрахабр не устоял, сравните:
int testing_habrahabr_syntax_highlighter = 1000;

int testing_habrahabr_syntax_highlighter = 1'000;

int testing_habrahabr_syntax_highlighter = 1'000'000;

int testing_habrahabr_syntax_highlighter = 1'0'0'0'0'0'0;

Аттрибут [[deprecated]]


В C++11 был стандартизирован синтаксис объявления аттрибутов, ранее известных как __attribute__ для gcc/clang и __declspec для VC++. В C++14 был добавлен аттрибут, позволяющий пометить любой из следующих токенов: класс, переменную, нестатический член класса, функцию, перечисление, специализацию шаблона или typedef — как устаревший, если по каким-либо причинам дальнейшее их использование нежелательно. В результате, при использовании программистом помеченных таким аттрибутом токенов, компилятор будет выдавать предупреждение. Опциональный параметр аттрибута позволяет указать свое дополнительное сообщение (например, предложение о подходящей замене), которое будет выведено вместе с предупреждением компилятора.
void foo();
[[deprecated("use 'foo' instead")]] void bar();

Допускается переобъявление токенов с этим аттрибутом, если Вы, например, хотите запретить своей команде разработчиков использовать некоторые функции из сторонних библиотек, однако снять действие этого аттрибута переобъявлением нельзя.
#include <GL/gl.h>
[[deprecated("use 'glDrawArrays' instead")]] void glBegin(GLenum);

На усмотрение разработчиков STL, все подходящие токены, указанные в дополнении D к стандарту C++ (Compatibility features), могут быть помечены этим аттрибутом.

Изменения в стандартной библиотеке


Пользовательские литералы для std::complex


Добавлены следующие литералы для быстрого создания комплексных чисел, состоящих только из мнимой части:
namespace std {
inline namespace literals {
inline namespace complex_literals {
constexpr complex<long double> operator""il(long double);
constexpr complex<long double> operator""il(unsigned long long);
constexpr complex<double> operator""i(long double);
constexpr complex<double> operator""i(unsigned long long);
constexpr complex<float> operator""if(long double);
constexpr complex<float> operator""if(unsigned long long);
}}}

В результате можно легко и просто создавать комплексные числа привычными арифметическими операциями:
using namespace std;
complex<double> a = 1.5 + 0.3i;
auto b = 2.3 - 0.2i;

Технические спецификации


image
Как показано на изображении, до 2011 комитет использовал «монолитную» модель, где все новые возможности попадали в единственный черновик стандарта.
Начиная с 2012 комитет перешел на более «распределенную» модель, где основные направления разработки стандарта ведутся независимо от самого стандарта со своей скоростью и могут быть выпущены как только будут готовы, не дожидаясь выхода основного стандарта, в виде технических спецификаций (ТС), с последующим слиянием вместе с ним через некоторое время. Такая модель позволяет комитету представлять работу публике небольшими частями более быстрым и предсказуемым способом. Это также должно ускорить выпуск новых версий самого стандарта.

На данный момент уже одобрен черновик технической спецификации API для работы с файловой системой, основанный на Boost.Filesystem v3, включая итерацию по файлам и директориям.

Активно ведется доработка следующих спецификаций:
  1. Networking TS. На данный момент содержит в себе:
    • Функции для преобразования порядка байт между сетевым (big-endian) и используемым на локальной машине, основанные на функциях htonl(), htons(), ntohl(), ntohs() стандарта POSIX. Уже одобрено комитетом.
    • API для работы с URI. Еще ожидает одобрения комитета.
  2. Library Fundamentals TS: Представляет из себя набор расширений основной части стандартной библиотеки. Сюда были вынесены optional<> и другие фундаментальные утилиты для доработки.
  3. Array Extensions TS: Расширения языка и библиотеки связанные с массивами. Сюда были вынесены runtime-sized arrays и dynarray<> для доработки.
  4. Concurrency TS: Изначально включает в себя поддержку исполнителей (executors) и планировщиков (schedulers) и поддержку неблокирующих операций для std::future, таких как .then() и .when_*(). Позже сюда могут быть добавлены расширения языка, типа await, и расширения библиотеки, типа параллельных хэш-контейнеров.
  5. Расширения для параллелизма: Изначально включает в себя параллельную STL библиотеку с поддержкой параллельных алгоритмов, использующих несколько ядер процессора, и векторизуемых (vectorizable) алгоритмов, использующих всю мощь наборов инструкций процессоров.

Все технические спецификации используют пространтсво имен std::experimental.

Также недавно начала свою работу группа, занимающаяся графикой, с целью стандартизировать «2D Lite» API для рисования. Небольшое обсуждение графики и C++ можно посмотреть в презентации Герба Саттера с GoingNative2013, начиная с 42:30 здесь.

Заключение


Следующая встреча комитета запланирована на февраль 2014 года. После чего мы получим некоторое подобие релиз кандидата следующего — С++14 стандарта, также известного, как С++1y.
По последним данным, Clang вместе с libc++ в SVN уже полностью реализуют текущий черновик стандарта, GCC несколько отстает. Убедиться в этом можно здесь: Clang, libc++, GCC.

Обзор новых возможностей С++14: Часть 1
Текущий черновик стандарта

P.S. swap оператор


Среди всех прочих предложений для стандартизации, прошлой весной появилось предложение внести в С++ специальный оператор обмена :=:, чтобы заменить функцию стандартной библиотеки std::swap. Тогда некоторые восприняли это как первоапрельскую шутку, но в конце августа предложение обновилось до версии 2. Мне пока не известно мнение комитета о данном операторе, но его еще пока не одобрили для стандартизации. Подробнее прочитать о нем можно здесь.
Only registered users can participate in poll. Log in, please.
Как Вы считаете, нужен ли в С++ оператор :=:?
48.21% Да, он будет полезен. 552
51.79% Нет, он будет лишним. 593
1145 users voted. 231 users abstained.
Tags:
Hubs:
+45
Comments 84
Comments Comments 84

Articles