Поделиться через


Функции C++11 (самомоднейшее C++)

В этом документе описываются функции новое известного стандартного - также C, C-++, как C ++11-that реализованы в Visual C# и C-++.

Функции языка C ++11 ядра

Visual C++ 2010 реализовывать различные функции в спецификации языка C ++0x базовой, которой был прекурсор в C++11Visual C++ в Visual Studio 2012 и развернуть на этом для включения множество функций C ++11.В следующей таблице перечислены основные функции языка C ++11 и их состояние реализации как в Visual C++ 2010, так и в Visual C++ в Visual Studio 2012.

Функции языка C ++11 ядра

VC10

VC11

Ссылки v0.1 Rvalue управляемый, v2.0v2.1v3.0

v2.0

v2.1*

ref-квалификаторы

Нет

Нет

статические инициализаторы элемента данных.

Нет

Нет

Шаблоны v0.9, Variadic управляемый

Нет

Нет

Списки инициализации

Нет

Нет

static_assert

Да

Да

auto v0.9, управляемый

управляемый

управляемый

Конечные возвращаемые типы

Да

Да

Лямбда-выражения v0.9, управляемыйверсия

управляемый

версия

decltype управляемый, версия

управляемый

версия **

Прямоугольные квадратные скобки

Да

Да

Аргументы шаблона по умолчанию для шаблонов функции

Нет

Нет

Выражение SFINAE

Нет

Нет

Шаблоны псевдонима

Нет

Нет

Внешние шаблоны

Да

Да

nullptr

Да

Да

Строго типизированные перечисления

Partial

Да

Поиск объявляются перечисления

Нет

Да

Атрибуты

Нет

Нет

constexpr

Нет

Нет

Выравнивание

TR1

Partial

Делегировании конструкторы

Нет

Нет

Наследование конструкторы

Нет

Нет

Операторы явного преобразования

Нет

Нет

char16_t

Нет

Нет

Литералы строки юникода

Нет

Нет

Необработанные строковые литералы

Нет

Нет

Универсальные имена символов в литералах

Нет

Нет

Определяемые пользователем литералы

Нет

Нет

Стандартная раскладка и тривиальные типы

Нет

Да

Не выполняются по умолчанию и удаленные функции

Нет

Нет

Расширение объявления friends

Да

Да

Расширенный

Нет

Нет

Встроенные пространства имен

Нет

Нет

Неограниченные соединения

Нет

Нет

Локальные и неименованные типы как аргументы шаблонов

Да

Да

определен цикл Диапазон-.

Нет

Да

переопределение и конечные v0.8, v0.9управляемый

Partial

Да

Минимальная поддержка СБОРКИ

Да

Да

noexcept

Нет

Нет

Основные функции языка C++11: Параллелизм

VC10

VC11

Reworded точек последовательности

Неприменимо

Неприменимо

Atomics

Нет

Да

Строгая сравнивать и обменяйте

Нет

Да

Двунаправленные загородки

Нет

Да

Модель памяти

Неприменимо

Неприменимо

упорядочение данных зависимости

Нет

Да

упорядочение данных зависимости: заметка функции

Нет

Нет

exception_ptr

Да

Да

quick_exit

Нет

Нет

Atomics в обработчиках сигнала

Нет

Нет

Локальной памяти потока

Partial

Partial

Волшебная статика

Нет

Нет

Основные функции языка C++11: C99

VC10

VC11

__func

Partial

Partial

Препроцессор C99

Partial

Partial

длина текста

Да

Да

Расширение целочисленные типы

Неприменимо

Неприменимо

Здесь быстрое руководство по данным в таблицах.

Hh567368.collapse_all(ru-ru,VS.110).gifСсылки Rvalue

N1610 "пояснение инициализации объектов значений rvalue класса" была предыдущая попытка включить семантики перемещения без ссылки rvalue.В этом разделе описаны в целях, назовем его "rvalue ссылается v0.1". Он был заменен "ссылки управляемый rvalue." "Rvalue" указывает v2.0, что был основан на работу в Visual C++ 2010, запрещает ссылки rvalue из привязки к значениям и поэтому требует основных вопросов безопасности. "Ссылки v2.1 Rvalue "настроить это правило.Рассмотрим vector<string>::push_back(), который имеет перегруженные методы push_back(const string&) и push_back(string&&), и вызов v.push_back("strval").Выражение "strval" - строковый литерал, и это значение.(Другие литералы, например целое число 1729, значений rvalue, но строковые литералы, поскольку они зарезервированы массивы). Правила v2.0 ссылки rvalue сказали, string&& не может выполнить привязку к "strval", так как значение "strval", и, таким образом, push_back(const string&) является единственной жизнеспособная определены.В результате будет создан временное std::string, скопировать его в вектор, а затем удаляет временные std::string.Это не является очень эффективно.Правила v2.1 ссылки rvalue узнают, что привязка string&& в "strval" для создания временное std::string и что временно rvalue.Поэтому push_back(const string&) и push_back(string&&) жизнеспособны и push_back(string&&) предпочтено.Временное std::string создается, затем перемещается в вектор.Это более эффективно.

"Ссылки v3.0 Rvalue" добавляют новые правила автоматически создать конструкторы перемещения и перемещение операторы присваивания при определенных условиях.Однако это не реализуется в Visual C++ в Visual Studio 2012, должном ко времени и ограничений на количество ресурсов.

Предупреждающее замечаниеВнимание

V0.1 управляемый код, v2.0, v2.1, назначения v3.0 изобретены для ясности и отображения развитие C ++11.

Hh567368.collapse_all(ru-ru,VS.110).gifLambdas

После того как лямбда-функции. проголосовано в рабочий план (версия 0.9) и добавленные изменяемое лямбда-выражения (версия 1.0), комиссия стандартизации отремонтировал формулировки.Это созданный лямбда-выражения версия 1.1.Это произошло слишком поздно включения в Visual C++ 2010, но в Visual C++ в Visual Studio 2012.Формулировка лямбда-выражений v1.1 уточняет, что должно произойти в угловых случаях как обращение к статическим элементам или вложенном лямбда-выражениям.Это устраняет ошибки, которые активированы сложными лямбда-выражениями.Кроме того, в Visual C++ в Visual Studio 2012, не имеющие состояний лямбда-выражения обратимы с указателями функций.Это не в формулировках N2927, но перечисленных в рамках лямбда-выражений v1.1 как есть.FDIS 5.1.2] [expr.prim.lambda/6 - это описание: "Тип для закрытия лямбда-выражения без лямбда-выражение- захвата имеет функцию преобразования const открытого метода " не явную указатель на функцию, одни и те же параметры и возвращаемые типы как оператор вызова функции типа закрытия.Значение, возвращаемое этой функцией преобразования будет адрес функции, призыванный, имеет тот же эффект, что и вызов оператор вызова функции типа закрытия". Visual C++ в Visual Studio 2012 (даже лучше, чем то, поскольку мы делали не имеющие состояний обратимым лямбда-выражения с указателями функций, имеющие произвольные соглашения о вызове.Это важно при использовании API, ожидающие действия как указатели функции __stdcall ).

Hh567368.collapse_all(ru-ru,VS.110).gifdecltype

После того как decltype было проголосовано в рабочий план (версия 1.0), оно получило небольшой, но важное исправление ошибок в последнюю минуту (версия 1.1).Это представляет интерес больший интерес разработчикам приложений, работающих на STL и поддержке.

Hh567368.collapse_all(ru-ru,VS.110).gifСтрого типизированный/вперед объявлен перечисления

Строго типизированные перечисления частично до в Visual C++ 2010 (в частности, части о явно определенных базовых типов).Visual C++ в Visual Studio 2012 полностью реализовать их, а также полностью реализует семантику C для переадресуйте объявленные перечисления++11.

Hh567368.collapse_all(ru-ru,VS.110).gifВыравнивание

Ни Visual C++ 2010 и Visual C++ в Visual Studio 2012 реализуют ключевые слова alignas и alignof из предложение выравнивания языка, которое было проголосовано в рабочий план.Visual C++ 2010 содержит aligned_storage из TR1.Visual C++ в Visual Studio 2012 добавляет aligned_union и std::align() в стандартную библиотеку.

Hh567368.collapse_all(ru-ru,VS.110).gifСтандартная раскладка и тривиальные типы

Добавления, изменения из "Продукта СТРУЧОК N2342; Разрешить основная проблема редакции 568 (5)"is_trivial и is_standard_layout значение <type_traits>.(N2342 переработало много основные формулировки языка, но никакие изменения компилятора не требуются). Эти характеристики типа были доступны в Visual C++ 2010, но они просто дублировали is_pod.Поэтому таблица ранее в этом документе сказала: "нет" поддержки.В Visual C++ в Visual Studio 2012, их на платформе обработчики компилятора, предназначенных для предоставления точных ответы.

Hh567368.collapse_all(ru-ru,VS.110).gifпереопределение и окончательный

Это прошло через краткое, но осложненное отличий.Первоначально в версия 0.8 существуют были [[override] [,] [hiding]] и [[base_check]] атрибуты.Затем в версия 0.9, атрибуты были исключены и были заменены контекстными ключевыми словами.Наконец, в версия 1.0, они были уменьшается в final на классах" и "override" и "final" для функций.Это делает его возведенное расширение, поскольку Visual C++ 2010 уже поддерживало этот синтаксис "override" для функций и было достаточно семантику кнопку, указанным в C ++11. "final" также поддерживается, но в различные записью "запечатать".В Visual Studio 2012, стандартные записи и семантика "override" и "final" полностью поддерживаются.Дополнительные сведения см. в разделах Спецификатор override и Спецификатор final.

Hh567368.collapse_all(ru-ru,VS.110).gifAtomics и пр.

Atomics, строгая сравнивать и обменяйте и двунаправленные загородкиупорядочение данных зависимости укажите стандартное машинное оборудование, библиотеки, реализованным в Visual C++ в Visual Studio 2012.

Hh567368.collapse_all(ru-ru,VS.110).gifСтандартные функции библиотеки

Это описание основной язык.Как для стандартной библиотеки C ++11 мы не имеется милую таблицу функций Visual C++ в Visual Studio 2012, но ее реализации, с 2 исключениями.Во-первых, когда функция библиотеки зависит от функций, отсутствует в компиляторе мы имитируем, выполненных требовать- для примера мы моделирует variadic шаблоны для make_shared<T>()— это не снабжаем или его - только существует несколько ситуаций, прежде всего, <initializer_list>.Во-вторых, стандартная библиотека C99, которая включается по ссылке в стандартную библиотеку C ++11, в основном нереализованных, хотя <stdint.h> было реализовано в Visual C++ 2010.Здесь частично список изменений в Visual C++ в Visual Studio 2012:

Новые заголовков:<atomic>, <chrono>, <condition_variable>, <future>, <mutex>, <ratio>, <scoped_allocator> и <thread>.

Emplacement: согласно требованиям C, ++11 emplace()/emplace_front()/emplace_back()/emplace_hint()/emplace_after() реализован во всех контейнерах для "произвольные" число аргументов (см. раздел "раздела variadics Faux").Например, vector<T> имеет переадресованное полностью "template <typename... Args> void emplace_back(Args&&... args)", непосредственно выполняет построение элемента типа T обратно в двух из произвольных произвольного числа аргументов.Это может быть более эффективным, чем push_back(T&&), которое содержит бы дополнительные построения и уничтожение перемещения.

**Variadics Faux:**Visual C++ в Visual Studio 2012 имеет новую схему для имитации ввода variadic шаблоны.В Visual C++ 2008 и Visual C++ 2010 SP1, subheaders повторно были включены с макросы, иначе каждый раз, к перегруженным штемпеля out для 0, 1, 2, 3 или несколько аргументов.Например, <memory> содержит внутреннее subheader <xxshared> повторно, в штемпелю в make_shared<T>(args, args, args).В Visual C++ в Visual Studio 2012, subheaders поддерживаются.Теперь variadic шаблоны, определяются как макросы (с большими обратная косая черта- продолжения), а затем развернуты с помощью мастерских макросов.Это внутреннее реализации изменение имеет следующие последствия:

  • Код более поддерживать, легче использовать (добавление subheaders был достаточным количеством рабочих) и для чтения.

  • Более сложно зайти с отладчика огорченное!

  • Конструктор pair(piecewise_construct_t, tuple<Args1...>, tuple<Args2...>)std::pair, "интересные" эффекты.Это требует перегруженных N^2 (если бы поддерживаем до 10 кортежей, тех означает 121 перегруженные варианты, поскольку пустые кортежи подсчитывают здесь, слишком).

Спам out большое число попарного кортеж перегружает, плюс все перегруженные emplacement, используется огромное количество памяти во время компиляции.Поэтому рекомендуется уменьшили бесконечности.В Visual C++ 2008 и Visual C++ 2010 SP1, infinity была 10 (то есть" шаблоны "variadic поддержке от 0 до 10 аргументов, инклюзивных).По умолчанию - infinity 5 в Visual C++ в Visual Studio 2012.Это приносит использование памяти компилятора обратно на все его в Visual C++ 2010.Если требуются дополнительные аргументов (например, если существует код, который использует 6 кортежей), выходной люк.Можно указать _VARIADIC_MAX для всего проекта от 5 до 10 включительно.Это используется больше памяти и может потребоваться используйте параметр компилятора /Zm зарезервировать больше пространства для предварительного компилированных заголовков.

Randomness: теперь uniform_int_distribution полностью беспристрастно и shuffle() реализован в <algorithm>, который принимает непосредственно равномерные генераторы случайных чисел, например mersenne_twister.

Перетащить на перегруженный оператор address-of операторов: C ++98/03 запретило элемент из контейнеров STL перегружать его оператор address-of.Это, как классы CComPtr обеспечивают, так что вспомогательные классы, как CAdapt требуются на экране STL из этих перегрузок.Во время разработки Visual C++ 2010, STL изменяет сделанный им отклоняет перегруженный оператор address-of операторов даже в нескольких ситуациях.C ++11 изменилось требования сделать перегруженный оператор address-of операторов приемлемым.C ++11 и Visual C++ 2010, а также вспомогательную функцию std::addressof(), которая может получить значение true адрес объекта независимо от перегрузки операторов.Прежде чем Visual C++ 2010 выпускается мы попытка заменить вхождения "&elem" с "std::addressof(elem)", которая упорна соответствующим образом.В Visual C++ в Visual Studio 2012, мы направлялись включен.Теперь следует проводить все контейнеры и все итераторы, чтобы классы, их перегружаются оператор address-of будут должны использоваться на протяжении STL.

Visual C++ в Visual Studio 2012 выходит за C ++11 несколькими способами:

Как СТРАШНЫЕ итераторы:, но не обязательно для C ++11 стандартным, СТРАШНЫЕ итераторы было реализовано, как описано следуют N2911 "свернуть зависимости внутри универсальных классов для более быстрой и более мелких программ" и Назначение "СТРАШНОЕ итератора N2980 редакция и инициализации, 1 ".

Заголовок <filesystem> из предложение TR2Система файлов: был добавлен.Он предлагает recursive_directory_iterator и другие интересные особенности.Прежде чем работать с TR2 был заморожен, поскольку C ++0x запущено слишком поздно и меняется на C ++11, предложение 2006, Boost.Filesystem V2 является производным от.Позже его особенность в Boost.Filesystem Версии, но не реализуется в Visual C++ в Visual Studio 2012.

Главная и оптимизация!Все данные, контейнеров теперь оптимально небольшие заданного их текущему представления.Это относится к объектам, контейнера, не соответствующие остроконечн- к содержимым.Например, std::vector содержит 3 необработанные указателя.В Visual C++ 2010, x86 режим выпуска, std::vector - 16 байт.В Visual C++ в Visual Studio 2012, 12 байта, оптимально мало.Это большой дел- при наличии 100.000 векторов в программе, Visual C++ в Visual Studio 2012 сохраняет только 400.000 байт.Сокращение потребление памяти сохраняет и место и время.

Это было достигнуто, исключая хранилища пустых распределителей и компараторов, поскольку std::allocator и std::less с неопределенным состоянием.(Эти оптимизации разрешено для пользовательских распределителей/компараторов слишком до тех пор, пока они не имеет состояний.Очевидно, что хранилища с отслеживанием состояния распределителей/компараторов не удается избежать, но они очень редко).

Hh567368.collapse_all(ru-ru,VS.110).gifРазмер контейнера

В следующей таблице показаны размеров контейнера, в байтах, для платформы x86 и x64.(32 бит ARM эквивалентно x86 в этих же формате).Режим выпуска описания этих таблиц, поскольку режим отладки содержит проверки машинное оборудование, которое используется пробел и время.Отдельные столбцы для Visual C++ 2008 SP1, где _SECURE_SCL не было выполнено по умолчанию устанавливается в 1, а для Visual C++ 2008 с SP1 _SECURE_SCL вручную значение 0 для максимальной скорости.Visual C++ 2010 и Visual C++ в Visual Studio 2012 не выполняют _SECURE_SCL по умолчанию устанавливается в 0 (теперь как _ITERATOR_DEBUG_LEVEL).

x86 размеров контейнера (байт)

VC9 SP1

VC9 SP1

SCL=0

VC10

VC11

вектор<int>

24

16

16

12

массив<int, 5>

20

20

20

20

deque<int>

32

32

24

20

forward_list<int>

Неприменимо

Неприменимо

8

4

список<int>

28

12

12

8

priority_queue<int>

28

20

20

16

очередь<int>

32

32

24

20

стека<int>

32

32

24

20

пары<int, int>

8

8

8

8

кортеж<int, int, int>

16

16

16

12

сопоставление<int, int>

32

12

16

8

multimap<int, int>

32

12

16

8

задайте<int>

32

12

16

8

multiset<int>

32

12

16

8

hash_map<int, int>

72

44

44

32

hash_multimap<int, int>

72

44

44

32

hash_set<int>

72

44

44

32

hash_multiset<int>

72

44

44

32

unordered_map<int, int>

72

44

44

32

unordered_multimap<int, int>

72

44

44

32

unordered_set<int>

72

44

44

32

unordered_multiset<int>

72

44

44

32

string

28

28

28

24

wstring

28

28

28

24

x64 размеров контейнера (байт)

VC9 SP1

VC9 SP1

SCL=0

VC10

VC11

вектор<int>

48

32

32

24

массив<int, 5>

20

20

20

20

deque<int>

64

64

48

40

forward_list<int>

Неприменимо

Неприменимо

16

8

список<int>

56

24

24

16

priority_queue<int>

56

40

40

32

очередь<int>

64

64

48

40

стека<int>

64

64

48

40

пары<int, int>

8

8

8

8

кортеж<int, int, int>

16

16

16

12

сопоставление<int, int>

64

24

32

16

multimap<int, int>

64

24

32

16

задайте<int>

64

24

32

16

multiset<int>

64

24

32

16

hash_map<int, int>

144

88

88

64

hash_multimap<int, int>

144

88

88

64

hash_set<int>

144

88

88

64

hash_multiset<int>

144

88

88

64

unordered_map<int, int>

144

88

88

64

unordered_multimap<int, int>

144

88

88

64

unordered_set<int>

144

88

88

64

unordered_multiset<int>

144

88

88

64

string

40

40

40

32

wstring

40

40

40

32

Краткое справочное руководство в числа версии Visual C-++ C.

Visual C#, C-++ имеет различные "номер версии" в зависимости от того, где необходимо найти.Затавренная версия (напечатанная в окне), внутренняя версия (отображаются в диалоговом окне О ) и версии компилятора, показанная макросом ( cl.exe и _MSC_VER ).

Затавренный номер версии

Внутренний номер версии

номер версии #define _MSC_VER

Visual C++ 2005

VC8

1400

Visual C++ 2008

VC9

1500

Visual C++ 2010

VC10

1600

Visual C++ в Visual Studio 2012

VC11

1700

Макрос _MSC_VER будет интересна для пользователей, которые хотят к основным номерам версий целевого объекта variant в Visual C++ и выдают другой их код.

См. также

Ссылки

Lambda expressions in C++

Основанное на диапазоне выражение for (C++)

Другие ресурсы

Добро пожаловать в C++ (современные C++)

Справочник по языку C++

Справочник по стандартной библиотеки C++

Visual C#, C-++ Team Blog