C + + 11 기능 (현대 C++)

이 문서의 새 표준 c + +의 기능을 설명-도 C + + 11-Visual C++ 구현 됩니다.

C + + 11 핵심 언어 기능

Visual C++ 2010C의 많은 기능을 구현 합니다. + + 0x의 전조가 된 핵심 언어 사양에에 C + + 11, 및 Visual Studio 2012의 Visual C++ 에 많은 C를 포함 하도록 확장 + + 11 기능.다음 테이블은 C + + 11 핵심 언어 기능 및 구현 상태 모두에서 Visual C++ 2010 및 Visual Studio 2012의 Visual C++.

C + + 11 핵심 언어 기능

VC10

VC11

Rvalue 참조 v0.1, v1.0, v2.0, v2.1, v3.0

v2.0

v2.1*

ref 한정자

아니요

아니요

비정적 데이터 멤버 이니셜라이저

아니요

아니요

Variadic 템플릿 v0.9, v1.0

아니요

아니요

이니셜라이저 목록은

아니요

아니요

static_assert

자동 v0.9, v1.0

v1.0

v1.0

반환 형식 후행

람다 식은 v0.9, v1.0, v1.1

v1.0

v1.1

decltype v1.0, v1.1

v1.0

v1.1* *

오른쪽 꺽쇠 괄호

기본 템플릿 인수를 함수 템플릿에 대 한

아니요

아니요

식 SFINAE

아니요

아니요

별칭 템플릿

아니요

아니요

Extern 템플릿을

nullptr

강력한 형식의 열거형

Partial

앞으로 열거형을 선언

아니요

특성

아니요

아니요

constexpr

아니요

아니요

맞춤

TR1

Partial

생성자에 위임

아니요

아니요

생성자 상속

아니요

아니요

명시적 변환 연산자

아니요

아니요

char16_t

아니요

아니요

유니코드 문자열 리터럴은

아니요

아니요

원시 문자열 리터럴을

아니요

아니요

유니버설 문자 이름도 리터럴의

아니요

아니요

사용자 정의 리터럴

아니요

아니요

표준 레이아웃 및 간단한 형식

아니요

기본적으로 함수를 삭제 하 고

아니요

아니요

Friend 선언을 확장

확장

아니요

아니요

인라인 네임 스페이스

아니요

아니요

공용 구조체에 무제한으로

아니요

아니요

로컬 및 명명 되지 않은 형식을 템플릿 인수로

범위 기반 for 루프

아니요

재정 및 최종 v0.8, v0.9, v1.0

Partial

최소한의 GC 지원을

noexcept

아니요

아니요

C + + 11 핵심 언어 기능: 동시성

VC10

VC11

시퀀스 위치 점을

N/A

N/A

Atomics

아니요

강력한 비교 및 교환

아니요

양방향 울타리

아니요

메모리 모델

N/A

N/A

데이터 종속성 순서

아니요

데이터 종속성 순서: 함수 주석

아니요

아니요

exception_ptr

quick_exit

아니요

아니요

신호 처리기에서 Atomics

아니요

아니요

스레드 로컬 저장소

Partial

Partial

마법 정적

아니요

아니요

C + + 11 핵심 언어 기능: C99

VC10

VC11

__func__

Partial

Partial

C99 전처리기

Partial

Partial

long long

정수 형식 확장

N/A

N/A

가이드의 정보 테이블에는 다음과 같습니다.

Hh567368.collapse_all(ko-kr,VS.110).gifRvalue 참조

N1610 "초기화 하는 클래스 개체에 의해 rvalue의 설명이" 초기 이동 의미 없는 rvalue 참조를 사용 하려고 했습니다.이 논의 편의 이제 "rvalue v0.1 참조." 호출 대체 된 "rvalue 참조 v1.0." "Rvalue 참조 v2.0"에 어떤 작업에 Visual C++ 2010 기초로, rvalue 참조를 lvalue가 바인딩 하 고 있으므로 주요 안전 문제를 해결 하지 못하도록 합니다. "Rvalue 참조 v2.1"이이 규칙을 구체화 합니다.고려 vector<string>::push_back(), 오버 로드 된 push_back(const string&) 및 push_back(string&&)를 호출 하 고 v.push_back("strval").식 "strval" 문자열 리터럴 이며 lvalue입니다.(다른 리터럴 정수 1729, 예를 들어, rvalue는 배열 이므로 문자열 리터럴을 특수 됩니다.) V2.0 규칙 2는 rvalue 참조 string&& 바인딩할 수 없습니다 "strval" 때문에 "strval" lvalue 되 고 따라서 push_back(const string&) 만 사용 가능한 오버 로드.이 임시 만드는 std::string는 벡터에 복사 하 고 다음 임시를 파괴 std::string.이 매우 효율적으로 되지 않았습니다.Rvalue 참조 v2.1 규칙 바인딩을 인식 string&& 에 "strval" 임시 만드는 std::string, rvalue는 임시입니다.따라서 모두 push_back(const string&) 및 push_back(string&&) , 표시 및 push_back(string&&) 선호 됩니다.임시 std::string 이며 생성 된 다음에 벡터를 이동 합니다.이 보다 효율적입니다.

"Rvalue 참조 v3.0" 자동 이동 생성자를 생성 하 고 할당 연산자 특정 조건에서 이동 하는 새 규칙을 추가 합니다.그러나이에서 구현 되지 않습니다 Visual Studio 2012의 Visual C++, 만료 시간 및 리소스 제약 조건입니다.

주의 정보주의

V0.1 v1.0, v2.0, v2.1, v3.0 명칭에는 창안 명확성 및 C의 발전 과정을 표시 하려면 + + 11.

Hh567368.collapse_all(ko-kr,VS.110).gifLambdas

람다 함수 작업 용지에 투표 했습니다 (버전 0.9) 및 변경할 수 있는 람다 식을 추가 되었습니다 (버전 1.0), 표현 표준화 위원회 정밀 하 게 분석 합니다.이렇게 생성 된 람다 버전 1.1.이에 통합 너무 늦게 발생 Visual C++ 2010, 하지만에서 Visual Studio 2012의 Visual C++.람다 v1.1 취지 아래 경우 참조 하는 정적 멤버 또는 중첩 된 람다 식에 다음과 같이 수행할 명확 하 게 설명 합니다.복잡 한 람다 식에서 발생 하는 버그를 해결 합니다.또한 Visual Studio 2012의 Visual C++, 상태 비저장 람다 함수 포인터를 변환할 수 있습니다.이 N2927 단어에 아니지만 그래도 람다 v1.1의 일부로 계산 됩니다.5.1.2 FDIS [expr.prim.lambda]/6이이 설명 되었습니다: "클로저 형식 람다 캡처는 람다 식에 대 한 공용 가상이 아닌 비 명시적 const 변환 함수 클로저 형식 함수 호출 연산자는 동일한 매개 변수 및 반환 형식을 사용 하는 함수에 대 한 포인터가 있습니다.변환 함수에 의해 반환 되는 값에는 함수의 주소를 지지 호출 될 경우 클로저 형식 함수 호출 연산자를 호출 하는 것과 같은 효과 있는지,. " (의 Visual Studio 2012의 Visual C++ 우리 상태 비저장 람다 임의의 호출 규칙이 있는 함수 포인터를 변환할 수 있는 변경 했기 때문에 그 보다도 더 있습니다.다음과 같은 항목을 예상 하는 Api를 사용 하는 경우 반드시 __stdcall 함수 포인터입니다.)

Hh567368.collapse_all(ko-kr,VS.110).gifdecltype

Decltype 작업 용지에 투표 한 후 (버전 1.0), 마지막 순간에 작지만 중요 한 버그 수정을 받은 (버전 1.1).이 많은 관심을 STL과 Boost에 근무 하는 프로그래머입니다.

Hh567368.collapse_all(ko-kr,VS.110).gif강력 하 게 형식화 된/앞으로 선언 되는 열거형

강력한 형식의 열거형 에서 부분적으로 지원 하 던 Visual C++ 2010 (특히, 명시적으로 지정 된 기본 형식에 대 한 부분).Visual Studio 2012의 Visual C++완벽 하 게 구현 하 고 C도 완벽 하 게 구현 + +에 대 한 의미를 11 앞으로 열거형을 선언.

Hh567368.collapse_all(ko-kr,VS.110).gif맞춤

모두 Visual C++ 2010 나 Visual Studio 2012의 Visual C++ 핵심 언어 키워드를 구현 alignas/alignof 에서 맞춤 제안서 작업 용지에 투표 합니다.Visual C++ 2010한 aligned_storage tr1에서.Visual Studio 2012의 Visual C++추가 aligned_union 및 std::align() 표준 라이브러리.

Hh567368.collapse_all(ko-kr,VS.110).gif표준 레이아웃 및 간단한 형식

노출 된 변경 내용으로 N2342 "의 포드 다시 검토; 핵심 문제 568 (수정 5) 해결 " 의 추가 된 is_trivial 및 is_standard_layout 에 <type_traits>.(핵심 언어 표현, 많은 n2342를 수정 하지만 컴파일러 변경이 필요 하지 않은). 이러한 형식의 특성에 사용할 수 있었던 Visual C++ 2010, 하지만 이러한 중복 된 is_pod.따라서이 문서의 앞부분에 나오는 테이블 "아니오" 지원을 한다고 합니다.Visual Studio 2012의 Visual C++, 정확한 답변을 제공 하도록 설계 된 컴파일러 후크 여 전원을 공급 합니다.

Hh567368.collapse_all(ko-kr,VS.110).gif재정 및 최종

이 짧지만 복잡 한 발전 과정을 통해 진행 되었습니다.원래,에 버전 0.8, 했습니다 [override]], [hiding]], 및 [base_check] 특성.다음에 버전 0.9에서 특성을 제거 하 고 상황별 키워드와 대체 되었습니다.마지막으로 버전 1.0, 감소 된 "final" 클래스 및 "override"및"final" 함수.이 Ascended 확장 하기 때문에 쉽게 Visual C++ 2010 이 이미 지원 되는 "override" 함수 구문을 근접 C의 의미를가지고 + + 11. "final"도 지원 했지만 다른 맞춤법에서"봉인".Visual Studio 2012, 표준 맞춤법 및 의미의 "override"및"final" 완벽 하 게 지원 됩니다.자세한 내용은 override 지정자final 지정자을 참조하십시오.

Hh567368.collapse_all(ko-kr,VS.110).gifAtomics, 및 기타

Atomics, 강력한 비교 및 교환, 양방향 울타리, 및 데이터 종속성 순서 에 구현 된 표준 라이브러리 기계 지정 Visual Studio 2012의 Visual C++.

Hh567368.collapse_all(ko-kr,VS.110).gif표준 라이브러리 기능

핵심 언어를 다룹니다.와 C + + 11 표준 라이브러리에서 우리가 필요가 예쁜 테이블의 기능을 하지만 Visual Studio 2012의 Visual C++ 두 개의 예외를 구현 하지.컴파일러에서 누락 된 기능 라이브러리 기능에 의존할 때, 먼저 우리는 요구 사항 시뮬레이션-예를 들어, 우리가 variadic 템플릿을 시뮬레이션 make_shared<T>()-또는 우리가 구현 하지 않는-가지 소수의 경우만 예를 들어, <initializer_list>.두 번째는 C99 표준 C에 참조로 통합 되어 라이브러리를 + + 11 표준 라이브러리를 아닙니다 대부분 구현 된, 있지만 <stdint.h> 에 구현 된 Visual C++ 2010.다음은 부분 목록에서 변경 내용을 Visual Studio 2012의 Visual C++.

새 머리글:<atomic>, <chrono>, <condition_variable>, <future>, <mutex>, <ratio>, <scoped_allocator>, 및 <thread>.

Emplacement: 필요에 따라 C + + 11 emplace()/emplace_front()/emplace_back()/emplace_hint()/emplace_after() "임의의" 숫자의 인수에 대 한 모든 컨테이너에서 구현 된 ("포 variadics" 절 참조).예를 들어, vector<T> 가 "template <typename... Args> void emplace_back(Args&&... args)" 뒤에 임의의 인수를 완벽 하 게 전달 하는 임의 개수의 벡터 T 형식의 요소를 직접 생성 합니다.보다 더 효율적일 수 있습니다 push_back(T&&), 여분의 이동 생성과 소멸에 관련 됩니다.

**포 variadics:**Visual Studio 2012의 Visual C++ 새 구성표 variadic 템플릿을 시뮬레이션 했습니다. Visual C++ 2008 S p 1와 Visual C++ 2010, subheaders 반복적으로 포함 된 매크로 다르게 때마다 스탬프를 0, 1, 2, 3 또는 더 많은 인수에 대 한 오버 로드를 정의 합니다.예를 들어, <memory> 내부 subheader 포함 <xxshared> 스탬프 아웃에 반복적으로 make_shared<T>(args, args, args).Visual Studio 2012의 Visual C++, Subheaders는 사라짐.이제 variadic 템플릿 (많은 백슬래시 연속), 매크로로 정의 되어 다음 마스터 매크로 사용 하 여 확장 합니다.이 내부 구현 변경 이러한 결과가 발생합니다.

  • 코드는 유지 관리 (subheaders 된 상당한 양의 작업 추가)를 사용 하 고 더 쉽게 읽을 수 있습니다.

  • 디버거를 한 단계씩 하기 어렵습니다-죄송 합니다!

  • pair(piecewise_construct_t, tuple<Args1...>, tuple<Args2...>) 생성자의 std::pair "흥미로운" 영향을 미치는.이렇게 해야 N ^2 오버 (10-빈 튜플을 여기 너무 계산 때문에 121 오버 로드, 즉, 튜플까지, 지원 되는 경우).

많은 쌍 튜플 오버 로드 플러스 emplacement 오버 로드를 모두 아웃 스팸 엄청난 양의 메모리 컴파일하는 동안 사용 합니다.따라서 우리가 무한대를 줄었습니다.Visual C++ 2008 S p 1와 Visual C++ 2010, 무한대 10 했습니다 (즉, "variadic" 템플릿 인수 0 ~ 10, 포괄 지원).기본적으로 무한대 5 인 Visual Studio 2012의 Visual C++.그러면 컴파일러 메모리 소비에 있었던에 다시 나타납니다 Visual C++ 2010.자세한 인수 (예를 들어, 6-튜플을 사용 하 여 기존 코드의 경우) 해야 하는 경우는 이스케이프 빗살 무늬가입니다.정의할 수 있습니다 _VARIADIC_MAX 프로젝트 전체의 5-10 까지의 사이.이 더 많은 메모리를 소비 하 고 사용 하는 것이 필요할 수 있습니다는 /Zm 컴파일러 옵션이 미리 컴파일된 헤더에 대 한 더 많은 공간을 예약 합니다.

**임의성:**uniform_int_distribution 는 이제 완벽 하 게 비편향 및 shuffle() 구현 <algorithm>, 직접 수락 균일 임의 번호 생성기와 같은 mersenne_twister.

연산자 오버 로드 된 주소의 저항: C + + 98/03 그 주소 연산자 오버 로딩에서 STL 컨테이너 요소를 금지 합니다.이것이 무엇 같은 클래스 CComPtr 하지 처럼 도우미 클래스는 CAdapt STL에서 이러한 오버 로드 보호 해야 했습니다.개발 하는 동안 Visual C++ 2010, STL 변경이 거부는 오버 로드 된 연산자의 주소에서 더 많은 상황입니다.C + + 11 연산자를 오버 로드 된 주소를 사용할 수 있도록 요구 사항을 변경 합니다.C + + 11과 Visual C++ 2010, 도우미 함수를 제공 합니다. std::addressof(), true 주소 연산자 오버 로딩에 관계 없이 개체를 가져올 수 있습니다.전에 Visual C++ 2010 되었습니다 출시 우리를 바꾸려면 시도 "&elem"와"std::addressof(elem)"를 적절히 방지 됩니다.Visual Studio 2012의 Visual C++을 추가로 승부수.해당 주소에 연산자를 오버 로드 하는 클래스를 STL 전체에서 사용할 수 있습니다 있도록 이제 우리 모든 컨테이너와 모든 반복기 감사 했습니다.

Visual Studio 2012의 Visual C++이동 외에 C + + 11을 여러 가지 방법으로:

무서운 반복기: 으로 허용 하지만 반드시 필요한은 c + + 11 표준 무서운 반복기 구현에 설명 된 대로 N2911 "최소화 종속성 내 제네릭 클래스에 대 한 속도 및 작은 프로그램"N2980 "무서운 반복기 할당 및 초기화, 개정 1".

파일 시스템: 의 <filesystem> 헤더에서 TR2 제안서 추가 되었습니다.제공 recursive_directory_iterator 및 기타 흥미로운 기능입니다.TR2 작업 때문에 고정 된 전에 C + + 0x 매우 늦게 실행 되 고 C로 변경 했습니다 + + 11 2006 제안 되었습니다에서 파생 된 Boost.Filesystem V2.이 나중에 발전 Boost.Filesystem v3에 있지만에 구현 되지 않은 Visual Studio 2012의 Visual C++.

하는 주요 최적화!모든 우리의 컨테이너 지금 현재 해당 표현 된 최적으로 작은입니다.이를 가리키는 내용에 컨테이너 개체 자체를 참조합니다.예를 들어, std::vector 세 원시 포인터를 포함 합니다.Visual C++ 2010, X86 릴리스 모드에서 std::vector 16 바이트입니다.Visual Studio 2012의 Visual C++,이 12 바이트 작은 최적입니다.그리 대단하냐고요-100000 벡터 프로그램에 있는 경우 Visual Studio 2012의 Visual C++ 400000 바이트 저장 합니다.감소 된 메모리 사용 공간 및 시간을 저장합니다.

이 빈 할당자 및 comparators를 저장 하지 않음으로써 때문에 달성 된 std::allocator 및 std::less 상태 비저장입니다.(상태 비저장 들 처럼 이러한 최적화 comparators 사용자 지정 할당자를도 활성화 됩니다.물론 저장소 할당자/comparators 안정의 피할 수 없는 있지만 매우 드문 경우입니다.)

Hh567368.collapse_all(ko-kr,VS.110).gif컨테이너 크기

다음 표에서 컨테이너 크기, x86 및 x64 플랫폼에 대 한 바이트 수를 표시합니다.(32 비트 ARM 이러한 목적을 위해 x86 같습니다).시간과 공간을 소모 하는 검사 기계 디버그 모드 들어 있기 때문에 이러한 테이블 릴리스 모드를 설명 합니다.별도 열에는 Visual C++ 2008 s p 1을 위치 _SECURE_SCL 및 1, 기본값 Visual C++ 2008 s p 1을 _SECURE_SCL 수동으로 최대 속도를 0으로 설정 합니다.Visual C++ 2010and Visual Studio 2012의 Visual C++ default _SECURE_SCL to 0 (now known as _ITERATOR_DEBUG_LEVEL).

x 86 컨테이너 크기 (바이트)

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>

N/A

N/A

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

복수 집합 <int>

32

12

16

8

hash_map < int, int >

72

44

44

32

< int, int > hash_multimap

72

44

44

32

hash_set <int>

72

44

44

32

hash_multiset <int>

72

44

44

32

< int, int > unordered_map

72

44

44

32

< int, int > unordered_multimap

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

x 64 컨테이너 크기 (바이트)

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>

N/A

N/A

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

복수 집합 <int>

64

24

32

16

hash_map < int, int >

144

88

88

64

< int, int > hash_multimap

144

88

88

64

hash_set <int>

144

88

88

64

hash_multiset <int>

144

88

88

64

< int, int > unordered_map

144

88

88

64

< int, int > unordered_multimap

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++ 버전 번호

Visual C++ 다른 "찾을 위치에 따라 버전 번호".(상자에 인쇄 되어 있음) 하는 브랜드 버전입니다. 내부 버전 (표시는 에 대 한 대화 상자), 및 컴파일러 버전 (표시 cl.exe , _MSC_VER 매크로).

브랜드 버전 번호

내부 버전 번호

#define _MSC_VER버전 번호

Visual C++ 2005

VC8

1400

Visual C++ 2008

VC9

1500

Visual C++ 2010

VC10

1600

Visual Studio 2012의 Visual C++

VC11

1700

_MSC_VER 매크로 주 버전을 대상으로 하려는 사람에 게 흥미로운 Visual C++ 및 다른 코드를 생성 합니다.

참고 항목

참조

C + +에서 람다 식

범위 기반 for 문(C++)

기타 리소스

C + + (현대 C++)를 다시 시작

C + + 언어 참조

표준 C++ 라이브러리 참조

팀 블로그 Visual C++