Функции 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.
VC10 |
VC11 |
|
---|---|---|
Ссылки v0.1 Rvalue управляемый, v2.0v2.1v3.0 |
v2.0 |
v2.1* |
Нет |
Нет |
|
Нет |
Нет |
|
Шаблоны v0.9, Variadic управляемый |
Нет |
Нет |
Нет |
Нет |
|
Да |
Да |
|
auto v0.9, управляемый |
управляемый |
управляемый |
Да |
Да |
|
Лямбда-выражения v0.9, управляемыйверсия |
управляемый |
версия |
decltype управляемый, версия |
управляемый |
версия ** |
Да |
Да |
|
Нет |
Нет |
|
Нет |
Нет |
|
Нет |
Нет |
|
Да |
Да |
|
Да |
Да |
|
Partial |
Да |
|
Нет |
Да |
|
Нет |
Нет |
|
Нет |
Нет |
|
TR1 |
Partial |
|
Нет |
Нет |
|
Нет |
Нет |
|
Нет |
Нет |
|
Нет |
Нет |
|
Нет |
Нет |
|
Нет |
Нет |
|
Нет |
Нет |
|
Нет |
Нет |
|
Нет |
Да |
|
Нет |
Нет |
|
Да |
Да |
|
Нет |
Нет |
|
Нет |
Нет |
|
Нет |
Нет |
|
Да |
Да |
|
Нет |
Да |
|
переопределение и конечные v0.8, v0.9управляемый |
Partial |
Да |
Да |
Да |
|
Нет |
Нет |
Основные функции языка C++11: Параллелизм |
VC10 |
VC11 |
---|---|---|
Неприменимо |
Неприменимо |
|
Нет |
Да |
|
Нет |
Да |
|
Нет |
Да |
|
Неприменимо |
Неприменимо |
|
Нет |
Да |
|
Нет |
Нет |
|
Да |
Да |
|
Нет |
Нет |
|
Нет |
Нет |
|
Partial |
Partial |
|
Нет |
Нет |
Основные функции языка C++11: C99 |
VC10 |
VC11 |
---|---|---|
Partial |
Partial |
|
Partial |
Partial |
|
Да |
Да |
|
Неприменимо |
Неприменимо |
Здесь быстрое руководство по данным в таблицах.
Ссылки 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. |
Lambdas
После того как лямбда-функции. проголосовано в рабочий план (версия 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 ).
decltype
После того как decltype было проголосовано в рабочий план (версия 1.0), оно получило небольшой, но важное исправление ошибок в последнюю минуту (версия 1.1).Это представляет интерес больший интерес разработчикам приложений, работающих на STL и поддержке.
Строго типизированный/вперед объявлен перечисления
Строго типизированные перечисления частично до в Visual C++ 2010 (в частности, части о явно определенных базовых типов).Visual C++ в Visual Studio 2012 полностью реализовать их, а также полностью реализует семантику C для переадресуйте объявленные перечисления++11.
Выравнивание
Ни 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() в стандартную библиотеку.
Стандартная раскладка и тривиальные типы
Добавления, изменения из "Продукта СТРУЧОК N2342; Разрешить основная проблема редакции 568 (5)"is_trivial и is_standard_layout значение <type_traits>.(N2342 переработало много основные формулировки языка, но никакие изменения компилятора не требуются). Эти характеристики типа были доступны в Visual C++ 2010, но они просто дублировали is_pod.Поэтому таблица ранее в этом документе сказала: "нет" поддержки.В Visual C++ в Visual Studio 2012, их на платформе обработчики компилятора, предназначенных для предоставления точных ответы.
переопределение и окончательный
Это прошло через краткое, но осложненное отличий.Первоначально в версия 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.
Atomics и пр.
Atomics, строгая сравнивать и обменяйте и двунаправленные загородкиупорядочение данных зависимости укажите стандартное машинное оборудование, библиотеки, реализованным в Visual C++ в Visual Studio 2012.
Стандартные функции библиотеки
Это описание основной язык.Как для стандартной библиотеки 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 с неопределенным состоянием.(Эти оптимизации разрешено для пользовательских распределителей/компараторов слишком до тех пор, пока они не имеет состояний.Очевидно, что хранилища с отслеживанием состояния распределителей/компараторов не удается избежать, но они очень редко).
Размер контейнера
В следующей таблице показаны размеров контейнера, в байтах, для платформы 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++ и выдают другой их код.
См. также
Ссылки
Основанное на диапазоне выражение for (C++)
Другие ресурсы
Добро пожаловать в C++ (современные C++)