Visual Studio 2017의 새로운 C++ 기능

Visual Studio 2017에는 C++ 환경에 대한 많은 업데이트와 수정이 포함되었습니다. 컴파일러 및 도구에서 250개 이상의 버그와 문제가 해결되었습니다. 대부분은 고객이 피드백 보내기 아래의 문제 보고 및 제안하기 옵션을 통해 제출한 것입니다. 버그를 알려 주셔서 감사합니다.

모든 Visual Studio의 새로운 기능에 대한 자세한 내용은 Visual Studio 2017의 새로운 기능을 참조하세요. Visual Studio 2019의 새로운 C++ 기능에 대한 자세한 내용은 Visual Studio 2019의 새로운 C++ 기능을 참조하세요. Visual Studio 2015 및 이전 버전의 새로운 C++ 기능에 대한 자세한 내용은 Visual C++ 2003~2015의 새로운 기능을 참조하세요. C++ 문서의 새로운 기능 문서에 대한 자세한 내용은 Microsoft C++ 문서: 새로운 기능을 참조하세요.

Visual Studio 2017 C++ 컴파일러

C++ 규칙 향상

이 릴리스에서는 C++ 컴파일러 및 표준 라이브러리가 C++11 및 C++14 기능에 대한 지원 향상으로 업데이트되었습니다. 또한 C++17 표준에 포함될 것으로 예상되는 특정 기능에 대한 예비 지원 기능도 포함하고 있습니다. 자세한 내용은 Visual Studio 2017의 C++ 규칙 향상을 참조하세요.

Visual Studio 2017 15.5 버전

컴파일러는 구조적 바인딩, constexpr 람다, if constexpr, 인라인 변수, fold 식 및 형식 시스템에 noexcept 추가 등 C++17에 새롭게 추가된 기능의 약 75%를 지원합니다. 이러한 기능은 /std:c++17 옵션 아래에서 사용할 수 있습니다. 자세한 내용은 Visual Studio 2017의 C++ 규칙 향상을 참조하세요.

Visual Studio 2017 버전 15.7

Visual Studio 버전 15.7의 MSVC 컴파일러 도구 집합은 이제 C++ 표준을 준수합니다. 자세한 내용은 알림: MSVC의 C++ 표준 준수Microsoft C/C++ 언어 규칙을 참조하세요.

Visual Studio 2017 버전 15.8

/experimental:preprocessor 컴파일러 스위치를 사용하면 궁극적으로 적용 가능한 모든 C 및 C++ 표준을 준수하는 새로운 실험적 MSVC 전처리기를 사용할 수 있습니다. 자세한 내용은 MSVC 새 전처리기 개요를 참조하세요.

새로운 컴파일러 옵션

  • /permissive-: 모든 엄격한 표준 준수 컴파일러 옵션을 사용하고 대부분의 Microsoft 전용 컴파일러 확장(예: __declspec(dllimport) 제외)을 사용하지 않도록 설정합니다. 이 옵션은 Visual Studio 2017 버전 15.5에서 기본적으로 켜져 있습니다. /permissive- conformance 모드에는 2단계 이름 조회에 대한 지원이 포함됩니다. 자세한 내용은 Visual Studio의 C++ 규칙 향상을 참조하세요.

  • /diagnostics: 줄 번호만, 줄 번호 및 열 또는 잘못된 코드 줄 아래 캐럿을 포함한 줄 번호와 열과 같이 세 가지 방법으로 진단 오류나 경고를 표시할 수 있습니다.

  • /debug:fastlink: 일부 디버그 정보를 PDB 파일에 복사하지 않음으로써 최대 30%까지 빠른 증분 연결 시간(Visual Studio 2015 대비)을 사용합니다. 대신, PDB 파일은 실행 파일을 만드는 데 사용된 개체 및 라이브러리 파일에 대한 디버그 정보를 가리킵니다. /Debug:fastlink를 사용하는 VS "15"의 더 빠른 C++ 빌드 주기Visual Studio에서 C++ 빌드 속도 향상을 위한 권장 사항을 참조하세요.

  • Visual Studio 2017에서는 /await와 함께 /sdl을 사용할 수 있습니다. 코루틴에서 /RTC 제한이 제거되었습니다.

Visual Studio 2017 15.3 버전
  • /std:c++14/std:c++latest: 이러한 컴파일러 옵션을 사용하면 프로젝트에서 특정 버전의 ISO C++ 프로그래밍 언어를 옵트인할 수 있습니다. /std:c++latest 옵션은 대부분의 새 초안 표준 기능을 보호합니다.

  • /std:c++17을 사용하면 컴파일러에서 구현된 일련의 C++17 기능을 사용할 수 있습니다. 이 옵션은 C++17 이후의 기능, 즉 작업 초안의 이후 버전과 C++ 표준의 결함 업데이트에서 변경되거나 새로운 기능에 대한 컴파일러 및 표준 라이브러리 지원을 사용 중지합니다. 이러한 기능을 사용하려면 /std:c++latest 를 사용하세요.

Codegen, 보안, 진단 및 버전 관리

이 릴리스에서는 최적화, 코드 생성, 도구 집합 버전 관리 및 진단의 몇 가지 기능이 향상되었습니다. 특히 주목할 만한 기능 향상은 다음과 같습니다.

  • 루프의 향상된 코드 생성: 상수 정수 나누기의 자동 벡터화를 지원하며, memset 패턴 식별 기능이 향상되었습니다.
  • 코드 보안 개선: 버퍼 오버런 컴파일러 진단의 내보내기가 개선되었으며, 이제는 /guard:cf가 점프 테이블을 생성하는 스위치 문을 보호합니다.
  • 버전 관리: 기본 제공 전처리기 매크로 _MSC_VER의 값이 이제 Visual C++ 도구 집합 업데이트 시마다 일정하게 업데이트됩니다. 자세한 내용은 Visual C++ Compiler Version(Visual C++ 컴파일러 버전)을 참조하세요.
  • 새 도구 세트 레이아웃: 개발 머신에서 컴파일러 및 관련된 빌드 도구의 위치 및 디렉터리 구조가 변경되었습니다. 새 레이아웃을 사용하면 여러 버전의 컴파일러를 병렬 설치할 수 있습니다. 자세한 내용은 Compiler Tools Layout in Visual Studio 2017(Visual Studio 2017의 컴파일러 도구 레이아웃)을 참조하세요.
  • 향상된 진단: 이제 출력 창에 오류가 발생하는 열이 표시됩니다. 자세한 내용은 C++ compiler diagnostics improvements in VS "15" Preview 5(VS "15" Preview 5의 C++ 컴파일러 진단 향상)를 참조하세요.
  • 코루틴을 사용할 때 실험적 키워드(keyword) 수율(옵션에서 /await 사용 가능)이 제거되었습니다. 대신 co_yield를 사용하도록 코드를 업데이트해야 합니다. 자세한 내용은 yield keyword to become co_yield in VS 2017(VS 2017에서 `yield` 키워드가 `co_yield`로 변경됨)을 참조하세요.
Visual Studio 2017 15.3 버전

컴파일러에서 진단 개선되었습니다. 자세한 내용은 Visual Studio 2017 15.3.0에서 향상된 진단 기능(영문)을 참조하세요.

Visual Studio 2017 15.5 버전

생성된 코드의 품질 향상을 통해 Visual C++ 런타임 성능은 계속 개선되고 있습니다. 이제 코드를 다시 컴파일하기만 하면 앱이 더 빠르게 실행됩니다. 컴파일러 최적화 기능 중에는 조건부 스칼라 저장소의 벡터화, 호출 sin(x)cos(x)를 새로운 sincos(x)로 결합, SSA 최적화 프로그램을 통한 중복 명령 제거와 같이 완전히 새로운 기능이 있습니다. 다른 컴파일러 최적화 기능으로는 조건식의 벡터화 도우미 추론, 더 나은 루프 최적화 및 부동 최소/최대 codegen과 같은 기존 기능에 대한 개선 사항이 있습니다. 링커에는 링크 시간 속도를 최대 9% 개선할 수 있는 새롭고 더욱 빠른 /OPT:ICF 구현이 있고, 증분 링크에는 다른 성능 개선 사항이 있습니다. 자세한 내용은 /OPT(최적화)/INCREMENTAL(증분 링크)을 참조하세요.

Microsoft C++ 컴파일러는 Intel의 AVX-512를 지원합니다. AVX-512의 새로운 기능을 128비트 및 256비트 너비의 레지스터에 가져오는 벡터 길이 명령이 포함되어 있습니다.

전체적으로 C++17 모드를 사용 중일 때 /Zc:noexceptTypes- 옵션을 사용하여 C++14 버전의 noexcept 로 되돌릴 수 있습니다. 이 옵션을 사용하면 모든 throw() 코드를 동시에 다시 작성하지 않고도 C++17을 준수하도록 소스 코드를 업데이트할 수 있습니다. 자세한 내용은 동적 예외 사양 제거 및 noexcept를 참조하세요.

Visual Studio 2017 버전 15.7
  • 새로운 컴파일러 스위치 /Qspectre는 예측 실행 부채널 공격을 완화하는 데 도움이 됩니다. 자세한 내용은 Spectre mitigations in MSVC(MSVC의 스펙터 완화)를 참조하세요.
  • 스펙터 완화를 위해 새로운 진단 경고 자세한 내용은 Spectre diagnostic in Visual Studio 2017 Version 15.7 Preview 4(Visual Studio 2017 버전 15.7 미리 보기 4의 스펙터 진단)를 참조하세요.
  • /Zc, /Zc:__cplusplus 의 새 값을 사용하면 C++ 표준 지원에 대한 올바른 보고가 가능합니다. 예를 들어 스위치가 설정되고 컴파일러가 /std:c++17 모드인 경우 값은 201703L 로 확장됩니다. 자세한 내용은 MSVC now correctly reports __cplusplus(MSVC가 이제 __cplusplus를 올바르게 보고)를 참조하세요.

C++ 표준 라이브러리

정확성 향상

Visual Studio 2017 RTM(버전 15.0)
  • 사소한 basic_string_ITERATOR_DEBUG_LEVEL != 0 진단 기능 개선. IDL 검사 문자열 기계에서 트립되면 이제 여정을 발생시킨 특정 동작을 보고합니다. 예를 들어 "문자열 반복기를 역참조할 수 없음" 대신 "문자열 반복기가 범위를 벗어났기 때문에 역참조할 수 없습니다(예: 끝 반복기)"가 표시됩니다.
  • 이전에 코드가 영원히 잠기는 문제가 발생하던 std::promise 이동 할당 연산자가 해결되었습니다.
  • atomic<T*>T*로 암시적으로 변환할 때 발생하는 컴파일러 오류를 해결했습니다.
  • pointer_traits<Ptr>가 이제 Ptr::rebind<U>를 올바르게 검색합니다.
  • move_iterator 빼기 연산자에서 누락된 const 한정자를 수정했습니다.
  • propagate_on_container_copy_assignmentpropagate_on_container_move_assignment를 요청하는 상태 저장 사용자 정의 할당자의 silent bad codegen을 수정했습니다.
  • atomic<T>가 이제 오버로드된 operator&()를 허용합니다.
  • 잘못된 bind() 호출에 대한 컴파일러 진단이 약간 개선되었습니다.

Visual Studio 2017 RTM에서는 더 많은 표준 라이브러리가 개선되었습니다. 전체 목록은 C++ 팀 블로그 항목 VS 2017 RTM의 표준 라이브러리 수정을 참조하세요.

Visual Studio 2017 15.3 버전
  • 표준 라이브러리 컨테이너는 이제 max_size()size_typemax()가 아닌 numeric_limits<difference_type>::max()로 제한합니다. 이 변경으로 인해 해당 컨테이너의 반복기에 대한 distance()의 결과를 distance()의 반환 형식으로 나타낼 수 있습니다.
  • 누락된 auto_ptr<void> 전문화가 수정되었습니다.
  • 이전에는 길이 인수가 정수 형식이 아닌 경우 for_each_n(), generate_n(), search_n() 알고리즘이 컴파일하지 못했습니다. 이제 비통합 길이를 반복기로 변환하려고 시도합니다. difference_type
  • normal_distribution<float>는 double에서 float로 좁히는 방법에 대한 경고를 표준 라이브러리 내부에서 더 이상 내보내지 않습니다.
  • 최대 크기 오버플로를 확인할 때 max_size() 대신 npos를 사용한 일부 basic_string 연산이 수정되었습니다.
  • condition_variable::wait_for(lock, relative_time, predicate)는 잘못된 대기 모드 해제가 있는 경우 전체 상대 시간 동안 대기했습니다. 이제는 상대 시간의 단일 간격 동안만 대기합니다.
  • future::get()은 표준에 필요한 만큼 future를 무효화합니다.
  • iterator_traits<void *>void&를 형성하려고 시도했기 때문에 하드 오류였습니다. 이제는 "is iterator" SFINAE 조건에서 iterator_traits를 사용할 수 있도록 완전하게 빈 구조체가 됩니다.
  • Clang -Wsystem-headers 에서 보고된 일부 경고가 수정되었습니다.
  • Clang -Wmicrosoft-exception-spec 에서 보고된 “선언의 예외 사양이 이전 선언과 일치하지 않습니다.”도 수정되었습니다.
  • Clang과 C1XX에서 보고된 mem-initializer-list 순서 지정 경고도 수정되었습니다.
  • 순서가 지정되지 않은 컨테이너는 컨테이너 자체가 교환될 때 해시 함수 또는 조건자를 교환하지 않았습니다. 이제는 교환합니다.
  • 표준 라이브러리에서 non-propagate_on_container_swap(정의되지 않은 non-equal-allocator 동작 조건)을 검색할 때 예외를 throw하지 않으므로 이제 많은 컨테이너 교환 작업이 noexcept로 표시됩니다.
  • 많은 vector<bool> 연산이 이제 noexcept로 표시됩니다.
  • 이제 표준 라이브러리는 옵트아웃 이스케이프 해치와 일치하는 할당자 value_type (C++17 모드)를 적용합니다.
  • basic_string에 대한 self-range-insert에서 문자열의 내용이 뒤섞이는 일부 조건이 수정되었습니다. (참고: 벡터에 대한 self-range-insert는 여전히 표준 라이브러리에서 금지됩니다.)
  • basic_string::shrink_to_fit()는 더 이상 할당자 propagate_on_container_swap의 영향을 받지 않습니다.
  • 이제 std::decay에서 abominable 함수 형식, 즉 정규화된 cv 함수 형식이나 정규화된 ref 함수 형식 또는 두 형식 모두를 처리합니다.
  • include 지시문에서 적절한 대/소문자 구분과 슬래시를 사용하도록 변경하여 이식성이 향상되었습니다.
  • "열거형 '열거자' 스위치의 열거자 '열거'가 사례 레이블에 의해 명시적으로 처리되지 않습니다." 경고 C4061이 수정되었습니다. 이 경고는 기본적으로 해제되어 있으며 경고에 대한 표준 라이브러리의 일반 정책에 대한 예외로 수정되었습니다. (표준 라이브러리에는 /W4가 없지만,/Wall은 유지됩니다. 기본적으로 꺼져 있는 경고는 비정상적으로 시끄러우며 주기적으로 사용할 것이 아닙니다.)
  • std::list 디버그 검사가 향상되었습니다. 이제는 목록 반복기에서 operator->()를 검사하고, list::unique()에서는 반복기를 무효화된(invalidated) 것으로 표시합니다.
  • tuple의 use-allocator 메타 프로그래밍이 수정되었습니다.
Visual Studio 2017 15.5 버전
  • std::partition은 이제 표준의 요구 사항에 따라 조건자를 N + 1회 대신 N회 호출합니다.
  • 버전 15.3에서 매직 정적을 방지하려는 시도는 버전 15.5에서 복구됩니다.
  • std::atomic<T>는 더 이상 T를 구성 가능한 기본값으로 요구하지 않습니다.
  • 반복기 디버깅을 사용하는 경우 로그 시간을 사용하는 힙 알고리즘이 다르게 동작합니다. 입력이 실제로 힙인 선형 시간 어설션을 더 이상 수행하지 않습니다.
  • 이제 __declspec(allocator)는 이러한 declspec를 인식하지 않는 Clang의 경고를 방지하기 위해 C1XX에서만 보호됩니다.
  • basic_string::npos는 이제 컴파일 시간 상수로 사용할 수 있습니다.
  • /Zc:alignedNew- 로 비활성화되지 않은 경우 C++17 모드의 std::allocator는 이제 과다 정렬된 형식(즉, 정렬이 max_align_t보다 큰 형식)의 할당을 올바르게 처리합니다. 예를 들어 16바이트 또는 32바이트 맞춤이 있는 개체의 벡터가 이제 SSE 및 AVX 명령에 맞게 올바르게 맞춰집니다.

규칙 향상

  • <any>, <string_view>, apply(), make_from_tuple()을 추가했습니다.
  • <optional>, <variant>, shared_ptr::weak_type 및 <cstdalign>을 추가했습니다.
  • min(initializer_list), max(initializer_list), minmax(initializer_list), min_element(), max_element(), minmax_element()에서 C++14 constexpr을 사용하도록 설정했습니다.

자세한 내용은 Microsoft C/C++ 언어 규칙을 참조하세요.

Visual Studio 2017 15.3 버전
  • 다른 여러 C++17 기능이 구현되었습니다. 자세한 내용은 Microsoft C++ 언어 규칙 테이블을 참조하세요.
  • 구현된 P0602R0 "variant 및 optional에서 복사/이동 사소성(triviality)을 전파해야 합니다".
  • 이제 표준 라이브러리에서 /GR- 옵션을 통해 동적 RTTI를 해제할 수 있도록 공식적으로 허용합니다. dynamic_pointer_cast()rethrow_if_nested()는 둘 다 기본적으로 dynamic_cast 가 필요하므로 표준 라이브러리에서 이제 /GR- 아래에 =delete로 표시됩니다.
  • 동적 RTTI를 통해 /GR-사용하지 않도록 설정된 경우에도 "정적 RTTI" 형식은 typeid(SomeType) 계속 사용할 수 있으며 여러 표준 라이브러리 구성 요소를 지원합니다. 이제 표준 라이브러리에서 /D_HAS_STATIC_RTTI=0 을 통해 이 기능도 사용 중지할 수 있도록 지원합니다. 이 플래그는 std::functionstd::any, target()target_type() 멤버 함수와 std::shared_ptrstd::weak_ptrget_deleter() friend 멤버 함수도 사용하지 않도록 설정합니다.
  • 이제 표준 라이브러리에서 조건부로 정의된 매크로 대신 C++14 constexpr을 무조건 사용합니다.
  • 이제 표준 라이브러리에서 별칭 템플릿을 내부적으로 사용합니다.
  • 이제 표준 라이브러리에서 nullptr_t{} 대신 nullptr을 내부적으로 사용합니다. (NULL의 내부 사용은 제거됩니다. 0-as-null의 내부 사용량은 점진적으로 클린.)
  • 이제 표준 라이브러리에서 std::forward()를 잘못된 스타일로 사용하는 대신 std::move()를 내부적으로 사용합니다.
  • static_assert(false, "message")을(를) #error message(으)로 변경했습니다. 이 변경으로 인해 #error에서 컴파일을 즉시 중지하기 때문에 컴파일러 진단이 향상됩니다.
  • 표준 라이브러리에서 더 이상 함수를 __declspec(dllimport)로 표시하지 않습니다. 최신 링커 기술에서는 이 선언자가 더 이상 필요하지 않습니다.
  • SFINAE가 기본 템플릿 인수로 추출되어 반환 형식 및 함수 인수 형식에 비해 간단하게 표시됩니다.
  • 이제 <random>의 디버그 검사에서 fputs()stderr로 호출한 내부 함수 _Rng_abort() 대신 표준 라이브러리의 일반 동작을 사용합니다. 이 함수의 구현은 이진 호환성을 위해 유지됩니다. 이것은 표준 라이브러리의 다음 이진 비호환 버전에서 제거됩니다.
Visual Studio 2017 15.5 버전
  • C++17 표준에 따라 몇 가지 표준 라이브러리 기능이 추가, 사용 중단 또는 제거되었습니다. 자세한 내용은 Visual Studio의 C++ 규칙 향상을 참조하세요.
  • 다음 병렬 알고리즘에 대한 실험적 지원:
    • all_of
    • any_of
    • for_each
    • for_each_n
    • none_of
    • reduce
    • replace
    • replace_if
    • sort
  • 다음 병렬 알고리즘의 시그니처가 추가되지만 지금은 병렬화되지 않습니다. 프로파일링은 요소만 이동하거나 음소거하는 알고리즘을 병렬화하는 데 도움이 되지 않습니다.
    • copy
    • copy_n
    • fill
    • fill_n
    • move
    • reverse
    • reverse_copy
    • rotate
    • rotate_copy
    • swap_ranges
Visual Studio 2017 버전 15.6
  • <memory_resource>
  • 라이브러리 기본 사항 V1
  • polymorphic_allocator 할당 삭제
  • 클래스 템플릿 인수 추론 향상
Visual Studio 2017 버전 15.7
  • 병렬 알고리즘 지원은 더 이상 실험적 지원이 아님
  • 새로운 <filesystem> 구현
  • 기본 문자열 변환(부분)
  • std::launder()
  • std::byte
  • hypot(x,y,z)
  • 불필요한 decay 방지
  • 수학 특수 함수
  • constexpr char_traits
  • 표준 라이브러리에 대한 추론 가이드

자세한 내용은 Microsoft C/C++ 언어 규칙을 참조하세요.

성능 및 처리량 수정

  • basic_string::find(char) 오버로드가 traits::find를 한 번만 호출하도록 수정되었습니다. 이전에는 길이가 1인 문자열의 일반 문자열 검색으로 구현되었습니다.
  • 이제 basic_string::operator==에서 문자열 내용을 비교하기 전에 문자열 크기를 확인합니다.
  • basic_string에서 컴파일러 최적화 프로그램을 통해 분석하기 어려운 컨트롤 결합이 제거되었습니다. 짧은 문자열에 대해 reserve를 호출하는 경우 아무 효과도 없이 여전히 비용이 듭니다.
  • std::vector 는 정확성과 성능을 위해 철저히 점검되었습니다. 삽입 및 배치 작업 중 별칭은 이제 표준에서 요구하는 대로 올바르게 처리되고, 표준 및 기타 논리를 통해 move_if_noexcept() 필요한 경우 강력한 예외 보장이 제공되며 삽입 및 emplace는 더 적은 요소 작업을 수행합니다.
  • 이제 C++ 표준 라이브러리에서 가상의 null 포인터를 역참조하지 못하도록 방지합니다.
  • weak_ptr::lock() 성능이 향상되었습니다.
  • 컴파일러 처리량을 늘리기 위해 이제 C++ 표준 라이브러리 헤더에서 불필요한 컴파일러 내장 함수의 선언이 포함되지 않도록 방지합니다.
  • std::stringstd::wstring 이동 생성자 성능이 3배 넘게 향상되었습니다.
Visual Studio 2017 15.3 버전
  • SEH(구조적 예외 처리)를 사용하는 함수로 std::atomic의 구현을 인라인하지 못하게 했던 noexcept와의 상호 작용이 해결되었습니다.
  • 표준 라이브러리의 내부 _Deallocate() 함수가 더 작은 코드로 최적화되어 더 많은 위치에 인라인될 수 있도록 변경되었습니다.
  • 재귀 대신 팩 확장을 사용하도록 std::try_lock()이 변경되었습니다.
  • 모든 잠금의 std::lock()에서 회전하는 대신 lock() 연산을 사용하도록 try_lock() 교착 상태 방지 알고리즘이 향상되었습니다.
  • system_category::message()에서 명명된 반환 값 최적화가 활성화되었습니다.
  • conjunctiondisjunction은 이제 2N + 2 형식 대신 N + 1 형식을 인스턴스화합니다.
  • std::function에서는 std::function으로 많은 고유 람다를 전달하는 프로그램에서 처리량을 향상시키고 obj 크기를 줄임으로써 더 이상 각 type-erased 호출 가능 코드에 대한 할당자 지원 기계를 인스턴스화하지 않습니다.
  • allocator_traits<std::allocator>에는 std::allocator부터 allocator_traits까지만 상호 작용하는 코드에서(즉, 대부분의 코드에서) 코드 크기를 줄이는, 수동으로 인라인된 std::allocator 연산이 포함됩니다.
  • 이제 표준 라이브러리에서 내부 클래스 _Wrap_alloc에 할당자를 래핑하는 대신 allocator_traits를 직접 호출하여 C++11 최소 할당자 인터페이스를 처리합니다. 이 변경으로 인해 할당자 지원을 위해 생성되는 코드의 크기가 줄어들고, 경우에 따라 표준 라이브러리 컨테이너에 대해 추론할 수 있는 최적화 프로그램의 기능이 향상되며, 더 효율적인 디버깅 환경이 제공됩니다(이제 디버거에서 _Wrap_alloc<your_allocator_type> 대신 할당자 유형이 표시됨).
  • 할당자를 사용자 지정할 수 없는 사용자 지정 allocator::reference에 대한 메타 프로그래밍이 제거되었습니다. (할당자는 컨테이너에서 고급 참조가 아니라 고급 포인터를 사용하도록 만들 수 있습니다.)
  • 컴파일러 프런트 엔드에 범위 기반 for 루프의 디버그 반복기를 래핑 해제하도록 지시하여 디버그 빌드의 성능이 향상되었습니다.
  • shrink_to_fit()reserve()에 대한 basic_string의 내부 축소 경로는 더 이상 재할당 작업의 경로에 있지 않으므로 모든 변경 멤버에 대한 코드 크기가 줄어듭니다.
  • basic_string 내부 증가 경로가 더 이상 shrink_to_fit() 경로에 없습니다.
  • basic_string의 변경 작업은 이제 할당되지 않은 빠른 경로와 할당된 느린 경로 함수에 팩터링되어 기능이 할당되므로 일반적인 재할당되지 않은 case가 호출자에 인라인될 가능성이 높아집니다.
  • basic_string의 변형 작업은 이제 크기를 조정하는 대신 원하는 상태로 재할당된 버퍼를 구성합니다. 예를 들어 문자열의 시작 부분에 있는 insert는 이제 정확히 한 번 삽입 후 콘텐츠를 이동합니다. 콘텐츠는 아래로 또는 새로 할당된 버퍼로 이동됩니다. 다시 할당하는 경우 먼저 새로 할당된 버퍼로 이동한 다음 아래로 이동하는 두 번 이동이 더 이상 수행되지 않습니다.
  • <string>에서 C 표준 라이브러리를 호출하는 작업은 이제 errno의 주소를 캐시하여 TLS와의 반복된 상호 작용을 제거합니다.
  • is_pointer 구현이 간소화되었습니다.
  • 함수 기반 식 SFINAE가 structvoid_t 기반으로 변경되었습니다.
  • 이제 표준 라이브러리 알고리즘에서 반복기의 사후 증가를 방지합니다.
  • 64비트 시스템에서 32비트 할당자를 사용할 때의 잘림 경고가 수정되었습니다.
  • 이제는 가능한 경우 버퍼를 다시 사용하여 비POCMA non-equal-allocator case에서 std::vector 이동 할당이 더 효율적입니다.
Visual Studio 2017 15.5 버전
  • basic_string<char16_t>에서는 이제 basic_string<wchar_t>이 참여하는 유사한 최적화 및 동일한 memcmp, memcpy에 참여합니다.
  • 함수 포인터가 인라인되지 않도록 하는 최적화 프로그램의 제한 사항(Visual Studio 2015 업데이트 3의 “함수 복사 방지” 작업에 의해 공개됨)이 해결되어 lower_bound(iter, iter, function pointer)의 성능이 복원되었습니다.
  • 순서 확인 전 반복기의 래핑을 해제하여 반복기 디버깅의 includes, set_difference, set_symmetric_differenceset_union 입력 순서 확인 오버헤드를 줄였습니다.
  • 이제 std::inplace_merge는 이미 제자리에 있는 요소를 건너뜁니다.
  • std::random_device를 생성해도 더 이상 std::string이 생성된 후 파괴되지 않습니다.
  • std::equalstd::partition에는 반복기 비교가 필요 없는 점프 스레딩 최적화 패스가 있었습니다.
  • std::reverse 사소한 복사 가능T으로 포인터가 전달되면 이제 필기 벡터화된 구현으로 디스패치됩니다.
  • std::fill, std::equalstd::lexicographical_compare은(는) std::bytegsl::byte(및 기타 char과 유사한 열거형 및 열거형 클래스)의 memsetmemcmp(으)로 디스패치하는 방법을 지시받았습니다. std::copyis_trivially_copyable을 사용하여 디스패치되므로 변경이 필요하지 않았습니다.
  • 표준 라이브러리는 더 이상 형식을 non-trivially-destructible로 만드는 동작만 수행하는 empty-braces 소멸자를 포함하지 않습니다.

기타 라이브러리

오픈 소스 라이브러리 지원

vcpkg는 오픈 소스 명령줄 도구로, Visual Studio에서 오픈 소스 C++ 정적 라이브러리와 DLL을 얻고 빌드하는 프로세스를 훨씬 간소화합니다. 자세한 내용은 vcpkg를 참조하세요.

CPPRest SDK 2.9.0

Visual Studio 2017 15.5 버전

C++용 플랫폼 간 웹 API인 CPPRestSDK는 버전 2.9.0으로 업데이트됩니다. 자세한 내용은 CppRestSDK 2.9.0 is available on GitHub(GitHub에서 CppRestSDK 2.9.0을 사용할 수 있음)를 참조하세요.

ATL

Visual Studio 2017 15.5 버전
  • 이름 조회 규칙의 다른 설정 수정
  • 기존 이동 생성자 및 이동 할당 연산자가 이제 비수행으로 올바르게 표시됩니다.
  • atlstr.h에서 스레드로부터 안전한 로컬 정적 초기화에 대한 유효한 경고 C4640 표시
  • ATL을 사용하여 DLL을 빌드할 때 XP 도구 집합에서 스레드로부터 안전한 로컬 정적 초기화가 자동으로 꺼졌습니다. 이제는 꺼지지 않습니다. 스레드로부터 안전한 초기화를 원하지 않는 경우 프로젝트 설정에 /Zc:threadSafeInit- 를 추가할 수 있습니다.

Visual C++ 런타임

  • 제어 흐름 보호 기호에 대한 새 헤더 "cfguard.h".

Visual Studio 2017 C++ IDE

  • 이제 구성 변경 성능이 C++ 네이티브 프로젝트의 경우 향상되었고, C++/CLI 프로젝트의 경우 훨씬 더 향상되었습니다. 솔루션 구성이 처음으로 활성화되면 속도가 빨라지고 이 솔루션 구성의 모든 이후 활성화는 거의 즉각적입니다.
Visual Studio 2017 15.3 버전
  • 여러 가지 프로젝트 및 코드 마법사가 시그니처 대화 상자 스타일로 다시 작성되었습니다.
  • 이제 클래스 추가를 선택하면 [클래스 추가] 마법사가 직접 시작됩니다. 이전에 여기에 있던 다른 모든 항목은 이제 추가 > 새 항목에서 사용할 수 있습니다.
  • Win32 프로젝트는 이제 새 프로젝트 대화 상자의 Windows 데스크톱 범주 아래에 있습니다.
  • 이제 Windows 콘솔데스크톱 애플리케이션 템플릿은 마법사를 표시하지 않고 프로젝트를 만듭니다. 이전의 Win32 콘솔 애플리케이션 마법사와 같은 옵션을 표시하는 동일한 범주 아래에는 새로운 Windows 데스크톱 마법사가 있습니다.
Visual Studio 2017 15.5 버전

리팩터링 및 코드 탐색에 IntelliSense 엔진을 사용하는 일부 C++ 작업은 훨씬 더 빨리 실행됩니다. 다음 값은 3500개 프로젝트가 있는 Visual Studio Chromium 솔루션을 기준으로 합니다.

기능 성능 향상
이름 바꾸기 5.3배
시그니처 변경 4.5배
모든 참조 찾기 4.7배

C++는 이제 Ctrl+Click Go To Definition을 지원하여 정의에 대한 마우스 탐색을 쉽게 해줍니다. Productivity Power Tools 팩의 구조 시각화 도우미도 이제 제품에 기본적으로 포함됩니다.

IntelliSense

  • 이제 새 SQLite 기반 데이터베이스 엔진이 기본적으로 사용됩니다. 새 엔진은 정의로 이동모든 참조 찾기와 같은 데이터베이스 작업 속도를 높입니다. 초기 솔루션 구문 분석 시간을 크게 향상시킵니다. 설정이 도구 옵션 텍스트 편집기 > C/C++ > 고급으로 이동되었습니다.>> (이전에는 ...C/C++ > 실험적에 있었습니다.)

  • 미리 컴파일된 헤더를 사용하지 않는 프로젝트 및 파일에 대한 IntelliSense 성능이 향상되었습니다. 현재 파일의 헤더에 대해 미리 컴파일된 자동 헤더가 만들어집니다.

  • IntelliSense 오류에 대한 오류 필터링 및 도움말이 오류 목록에 추가되었습니다. 이제 오류 열을 클릭하여 필터링할 수 있습니다. 또한 특정 오류를 클릭하거나 F1 키를 누르면 오류 메시지에 대한 온라인 검색이 시작됩니다.

    Error List.

    Error List Filtered.

  • 멤버 목록 항목을 종류별로 필터링하는 기능이 추가되었습니다.

    Member List Filtering.

  • 멤버 목록에 나타나는 항목의 컨텍스트 인식 필터링을 제공하는 새로운 실험적 예측 IntelliSense 기능이 추가되었습니다. 자세한 내용은 C++ IntelliSense Improvements – Predictive IntelliSense & Filtering(C++ IntelliSense 향상 – 예측 IntelliSense 및 필터링)을 참조하세요.

  • 이제 모든 참조 찾기(Shift+F12)를 사용하여 복잡한 코드베이스에서도 쉽게 탐색할 수 있습니다. 고급 그룹화, 필터링, 정렬, 결과 내 검색 및 (일부 언어의 경우) 색 지정이 제공되므로 참조를 명확하게 이해할 수 있습니다. C++의 경우 새로운 UI에 변수에서 읽고 있는지 아니면 변수에 쓰고 있는지에 대한 정보가 포함되어 있습니다.

  • Dot-to-Arrow IntelliSense 기능은 실험적에서 고급으로 이동되었으며 이제 기본적으로 사용하도록 설정됩니다. 편집기 기능 에서는 범위 확장 및 우선 순위 확장이 실험적에서 고급으로 이동되었습니다.

  • 실험적 리팩터링 기능인 시그니처 변경함수 추출을 기본적으로 사용할 수 있습니다.

  • C++ 프로젝트에 대해 ‘빠른 프로젝트 로드’라는 실험적 기능이 추가되었습니다. 다음에 C++ 프로젝트를 열 때 프로젝트가 더 빠르게 로드되고, 그 후에 프로젝트를 열 때는 ‘훨씬’ 더 빠르게 로드됩니다.

  • 이러한 기능 중 일부는 다른 언어에 공통적으로 적용되고, 일부는 C++에만 해당합니다. 이러한 새로운 기능에 대한 자세한 내용은 Announcing Visual Studio “15” Preview 5(Visual Studio “15” 미리 보기 5 발표)를 참조하세요.

Visual Studio 2017 버전 15.7

폴더 열기를 사용한 비 MSBuild 프로젝트에

Visual Studio 2017에는 폴더 열기 기능이 도입되었습니다. 솔루션 또는 프로젝트를 만들 필요 없이 소스 코드가 포함된 폴더에서 코딩, 빌드 및 디버그할 수 있습니다. 이제 프로젝트가 MSBuild 기반 프로젝트가 아니더라도 Visual Studio를 시작하는 것이 더 간단합니다. 폴더 열기로 강력한 코드 이해, 편집, 빌드 및 디버깅 기능에 액세스할 수 있습니다. 이러한 기능은 Visual Studio가 MSBuild 프로젝트에 이미 제공하고 있는 기능과 동일합니다. 자세한 내용은 C++용 폴더 열기 프로젝트를 참조하세요.

  • 폴더 열기 환경이 개선되었습니다. 다음 .json 파일을 통해 환경을 사용자 지정할 수 있습니다.
    • IntelliSense 및 검색 환경을 사용자 지정할 수 있는 CppProperties.json.
    • 빌드 단계를 사용자 지정할 수 있는 Tasks.json.
    • 디버깅 환경을 사용자 지정할 수 있는 Launch.json.
Visual Studio 2017 15.3 버전
  • MinGW 및 Cygwin과 같은 대체 컴파일러 및 빌드 환경에 대한 지원이 향상되었습니다. 자세한 내용은 Visual C++ 및 폴더 열기에서 MinGW 및 Cygwin 사용(영문)을 참조하세요.
  • CppProperties.json 및 CMakeSettings.json에서 전역 및 구성별 환경 변수를 정의하기 위한 지원이 추가되었습니다. 이러한 환경 변수는 launch.vs.json에 정의된 디버그 구성 및 tasks.vs.json의 작업에 사용될 수 있습니다. 자세한 내용은 Visual C++ 및 폴더 열기에서 환경 사용자 지정(영문)을 참조하세요.
  • 64비트 플랫폼을 쉽게 대상으로 지정할 수 있는 기능을 포함하여 CMake의 닌자 생성기에 대한 지원이 향상되었습니다.

폴더 열기를 사용한 CMake 지원

Visual Studio 2017에서는 MSBuild 프로젝트 파일(.vcxproj)로 변환하지 않고 CMake 프로젝트를 사용할 수 있는 지원이 도입되었습니다. 자세한 내용은 Visual Studio의 CMake 프로젝트를 참조하세요. 폴더 열기로 CMake 프로젝트를 여는 경우 C++ 편집, 빌드, 디버깅 환경이 자동으로 구성됩니다.

  • C++ IntelliSense가 루트 폴더에 CppProperties.json 파일을 만들지 않아도 작동합니다. 사용자가 CMake 및 CppProperties.json 파일에서 제공하는 구성 간에 쉽게 전환할 수 있도록 새 드롭다운을 추가했습니다.

  • CMakeLists.txt 파일과 같은 폴더에 있는 CMakeSettings.json 파일을 통해 추가 구성이 지원됩니다.

    CMake Open Folder.

Visual Studio 2017 15.3 버전
  • CMake Ninja 생성기에 대한 지원이 추가되었습니다.
Visual Studio 2017 버전 15.4
  • 기존 CMake 캐시 가져오기에 대한 지원이 추가되었습니다.
Visual Studio 2017 15.5 버전

Windows 데스크톱 개발

이제 원래 C++ 워크로드에 대한 보다 세분화된 설치 환경이 제공됩니다. 필요한 도구만 설치할 수 있는 선택 가능한 구성 요소를 추가했습니다. 설치 관리자 UI에 나열된 구성 요소에 대해 표시된 설치 크기는 정확하지 않으며 전체 크기는 이보다 클 수 있습니다.

C++ 데스크톱 작업에서 Win32 프로젝트를 성공적으로 만들려면 도구 집합과 Windows SDK를 둘 다 설치해야 합니다. 제대로 작동하도록 권장(선택된) 구성 요소 VC++ 2017 v141 도구 집합(x86, x64)Windows 10 SDK(10.0.nnnnn) 를 설치합니다. 필요한 도구가 설치되지 않으면 프로젝트가 성공적으로 만들어지지 않고 마법사의 응답이 중지됩니다.

Visual Studio 2017 15.5 버전

Visual C++ 빌드 도구(이전에 독립 실행형 제품으로 제공)가 이제 Visual Studio 설치 관리자에 작업으로 포함됩니다. 이 작업은 Visual Studio IDE를 설치하지 않고 C++ 프로젝트를 빌드하는 데 필요한 도구만 설치합니다. V140 및 v141 도구 집합이 모두 포함됩니다. v141 도구 집합에는 Visual Studio 2017 버전 15.5의 최신 향상 기능이 포함되어 있습니다. 자세한 내용은 Visual Studio Build Tools에 이제 VS2017 및 VS2015 MSVC 도구 집합 포함(영문)을 참조하세요.

C++를 사용한 Linux 개발

일반적으로 사용되는 확장인 Linux 개발용 Visual C++가 Visual Studio에 포함됩니다. 이 설치는 Linux 환경에서 실행되는 C++ 애플리케이션을 개발 및 디버깅하는 데 필요한 모든 사항을 제공합니다.

Visual Studio 2017 버전 15.2

플랫폼 간 코드 공유 및 형식 시각화에서 개선되었습니다. 자세한 내용은 플랫폼 간 코드 공유 및 형식 시각화에 대한 향상된 Linux C++ 기능을 참조하세요.

Visual Studio 2017 15.5 버전
  • Linux 워크로드는 원격 Linux 컴퓨터에 파일을 동기화하기 위한 sftp 대신 rsync에 대한 지원을 추가했습니다.
  • ARM 마이크로프로세서를 대상으로 하는 교차 컴파일을 위한 지원이 추가되었습니다. 설치에서 사용하도록 설정하려면 C++를 사용한 Linux 개발 워크로드를 선택하고 포함 및 IoT 개발 옵션을 선택합니다. 이 옵션은 ARM GCC 크로스 컴파일 도구 및 CMake를 설치에 추가합니다. 자세한 내용은 Visual Studio의 ARM GCC 크로스 컴파일(영문)을 참조하세요.
  • CMake에 대한 지원이 추가되었습니다. 이제 CMake를 Visual Studio 프로젝트로 변환할 필요 없이 기존의 CMake 코드 베이스에서 작업할 수 있습니다. 자세한 내용은 Linux CMake 프로젝트 구성을 참조하세요.
  • 원격 작업 실행에 대한 지원이 추가되었습니다. 이 기능을 사용하면 Visual Studio의 연결 관리자에 정의된 원격 시스템에 명령을 실행할 수 있습니다. 또한 원격 작업은 원격 시스템에 파일을 복사하는 기능을 제공합니다. 자세한 내용은 Linux CMake 프로젝트 구성을 참조하세요.
Visual Studio 2017 버전 15.7

C++를 사용한 게임 개발

C++의 모든 기능을 사용하여 DirectX 또는 Cocos2d로 구동하는 전문 게임을 개발해 보세요.

Android 및 iOS용 C++를 사용한 모바일 개발

이제 Visual Studio를 사용하여 Android 및 iOS를 대상으로 할 수 있는 모바일 앱을 만들고 디버깅할 수 있습니다.

유니버설 Windows 앱

C++는 유니버설 Windows 앱 워크로드에 대한 선택적 구성 요소로 제공됩니다. 현재는 C++ 프로젝트를 수동으로 업그레이드해야 합니다. Visual Studio 2017에서 v140을 대상으로 한 유니버설 Windows 플랫폼 프로젝트를 열 수 있습니다. 하지만 Visual Studio 2015가 설치되어 있지 않으면 프로젝트 속성 페이지에서 v141 플랫폼 도구 집합을 선택해야 합니다.

유니버설 Windows 플랫폼(UWP)의 C++에 대한 새로운 옵션

이제 유니버설 Windows 플랫폼 및 Windows Store용 C++ 애플리케이션 작성 및 패키징에 대한 새 옵션이 제공됩니다. 데스크톱 브리지 인프라를 사용하면 기존 데스크톱 애플리케이션 또는 COM 개체를 패키징하여 Windows 스토어를 통해 배포할 수 있습니다. 또는 테스트용 로드를 통해 기존 채널을 통한 배포도 가능합니다. Windows 10의 새로운 기능을 사용하면 다양한 방법으로 데스크톱 애플리케이션에 UWP 기능을 추가할 수 있습니다. 자세한 내용은 데스크톱 브리지를 참조하세요.

Visual Studio 2017 15.5 버전

데스크톱 브리지를 통해 데스크톱 애플리케이션 패키징을 훨씬 간소화하는 프로젝트 템플릿인 Windows 애플리케이션 패키징 프로젝트가 추가되었습니다. 파일 | 새로 만들기 | 프로젝트 | 설치됨 | Visual C++ | 유니버설 Windows 플랫폼에서 사용할 수 있습니다. 자세한 내용은 Visual Studio(데스크톱 브리지)를 사용하여 앱 패키지를 참조하세요.

이제 새 코드를 작성할 때 헤더 파일에서만 구현되는 Windows 런타임용 표준 C++ 언어 프로젝션인 C++/WinRT를 사용할 수 있습니다. C++/WinRT를 사용하면 모든 표준 규격 C++ 컴파일러를 통해 Windows 런타임 API를 사용하고 작성할 수 있습니다. C++/WinRT는 C++ 개발자에게 최신 Windows API에 대한 최고 수준의 액세스를 제공하도록 설계되었습니다. 자세한 내용은 C++/WinRT 참조하세요.

Windows SDK Insider Preview의 빌드 17025부터 C++/WinRT가 Windows SDK에 포함됩니다. 자세한 내용은 Windows SDK에 이제 C++/WinRT가 포함됨(영문)을 참조하세요.

Clang/C2 플랫폼 도구 집합

이제 Visual Studio 2017과 함께 제공되는 Clang/C2 도구 집합이 대규모 프로젝트를 빌드하는 데 중요한 /bigobj 스위치를 지원합니다. 또한 컴파일러 프런트 엔드 및 백 엔드의 몇몇 중요한 버그 수정이 포함되어 있습니다.

C++ 코드 분석

C++ Core 지침을 적용하기 위한 C++ Core Checkers가 이제는 Visual Studio와 함께 배포됩니다. 프로젝트의 속성 페이지에 있는 코드 분석 확장 페이지에서 검사기를 사용하도록 설정합니다. 그러면 코드 분석을 실행할 때 확장이 포함됩니다. 자세한 내용은 C++ 핵심 지침 검사기 사용을 참조하세요.

Screenshot of the Property Pages dialog box showing Configuration Properties > Code Analysis > General selected and a number of Core Checks listed in teh Run this rule set section.

Visual Studio 2017 15.3 버전
  • 리소스 관리와 관련된 규칙에 대한 지원이 추가되었습니다.
Visual Studio 2017 15.5 버전
  • 새로운 C++ Core Guidelines 검사 항목에는 스마트 포인터 정확성, 올바른 전역 이니셜라이저 사용, goto 및 잘못된 캐스트 같은 구문 사용 플래그 지정이 포함됩니다.

  • 15.3에서 찾을 수 있는 일부 경고 번호는 15.5에서 더 이상 사용할 수 없습니다. 이러한 경고는 더 구체적인 검사로 대체되었습니다.

Visual Studio 2017 버전 15.6
Visual Studio 2017 버전 15.7
  • 실행할 코드 분석 규칙을 지정할 수 있는 /analyze:ruleset에 대한 지원이 추가되었습니다.
  • 추가 C++ 핵심 지침 규칙에 대한 지원이 추가되었습니다. 자세한 내용은 C++ 핵심 지침 검사기 사용을 참조하세요.

Visual Studio 2017에서 단위 테스트

Visual Studio 2017 15.5 버전

이제 Google Test Adapter와 Boost.Test Adapter가 C++를 사용한 데스크톱 개발 워크로드의 구성 요소로 제공되며, 테스트 탐색기와 통합됩니다. CMake 프로젝트에 대한 CTest 지원이 추가되었습니다(폴더 열기 사용). 단, 테스트 탐색기와의 완전한 통합은 아직 제공되지 않습니다. 자세한 내용은 C/C++에 대한 단위 테스트 작성을 참조하세요.

Visual Studio 2017 버전 15.6
  • Boost.Test 동적 라이브러리 지원에 대한 지원이 추가되었습니다.
  • 이제 Boost.Test 항목 템플릿을 IDE에서 사용할 수 있습니다.

자세한 내용은 Boost.Test 단원 테스트: 동적 라이브러리 지원 및 새 항목 템플릿을 참조하세요.

Visual Studio 2017 버전 15.7

C++ 단위 테스트 프로젝트에 대한 CodeLens 지원이 추가되었습니다. 자세한 내용은 C++ 단위 테스트 프로젝트에 대한 CodeLens 알림을 참조하세요.

Visual Studio 그래픽 진단

Visual Studio 그래픽 진단 도구: 이 도구를 사용하여 Direct3D 앱의 렌더링 및 성능 문제를 기록하고 분석할 수 있습니다. Windows PC에서 로컬로 실행 중이거나 Windows 디바이스 에뮬레이터 또는 원격 PC나 디바이스에서 실행 중인 앱에서 그래픽 진단 도구를 사용하세요.

  • 꼭짓점 및 기하 도형 셰이더의 입력 및 출력: 꼭짓점 셰이더 및 기하 도형 셰이더의 입력 및 출력을 보는 기능은 가장 많이 요청된 기능 중 하나입니다. 이제 도구에서 지원됩니다. 파이프라인 단계 보기에서 VS 또는 GS 단계를 선택하면 아래 표의 입력 및 출력 검사가 시작됩니다.

    Input/Output for shaders.

  • 개체 테이블에서 검색 및 필터링: 찾으려는 리소스를 빠르고 쉽게 찾는 방법을 제공합니다.

    Screenshot of the Object Table section with the Type drop-down and Search text box called out.

  • 리소스 기록: 이 새로운 보기는 캡처된 프레임 렌더링하는 동안 사용된 리소스의 전체 수정 기록을 간단하게 볼 수 있는 방법을 제공합니다. 리소스에 대한 기록을 호출하려면 리소스 하이퍼링크 옆에 있는 시계 아이콘을 클릭하세요.

    Resource history.

    리소스 변경 기록으로 채워진 새 리소스 기록 도구 창이 표시됩니다.

    Resource history change.

    전체 호출 스택 캡처를 사용하도록 설정하면 프레임을 캡처할 수 있습니다. 이렇게 하면 각 변경 이벤트의 컨텍스트를 신속하게 추론하고 Visual Studio 프로젝트 내에서 검사할 수 있습니다. 그래픽 진단의 Visual Studio 도구 > 옵션 대화 상자에서 전체 스택 캡처 옵션을 설정합니다.

  • API 통계: 프레임의 API 사용에 대한 대략적인 요약을 표시합니다. 당신이 전혀 만들고 있다는 것을 깨닫지 못할 수도 있고, 너무 자주 전화를 걸고 있다는 것을 깨닫지 못할 수도 있는 전화를 검색하는 데 유용합니다. 이 창은 Visual Studio Graphics Analyzer의 보기 > API 통계를 통해 사용할 수 있습니다.

    API stats.

  • 메모리 통계: 프레임에 생성하는 리소스에 드라이버가 할당하는 메모리 양을 표시합니다. 이 창은 Visual Studio Graphics Analyzer보기 > 메모리 통계를 통해 사용할 수 있습니다. 스프레드시트에서 볼 수 있도록 데이터를 CSV 파일로 복사하려면 마우스 오른쪽 단추를 클릭하고 모두 복사를 선택합니다.

    Memory stats.

  • 프레임 유효성 검사: 새로운 오류 및 경고 목록을 통해 Direct3D 디버그 계층에서 검색된 잠재적인 문제에 따라 이벤트 목록을 쉽게 탐색할 수 있습니다. Visual Studio Graphics Analyzer에서 보기 > 프레임 유효성 검사를 클릭하여 창을 엽니다. 그런 다음 유효성 검사 실행을 클릭하여 분석을 시작합니다. 프레임의 복잡성에 따라 완료하는 데 몇 분 정도 걸릴 수 있습니다.

    Frame validation.

  • D3D12에 대한 프레임 분석: 프레임 분석을 사용하여 안내된 “가상 분석” 실험을 통해 그리기 호출 성능을 분석할 수 있습니다. 프레임 분석 탭으로 전환한 다음 분석을 실행하여 보고서를 표시합니다.

    Frame analysis.

  • GPU 사용 개선 사항: 더 자세한 분석을 위해 GPUView 또는 WPA(Windows 성능 분석기) 도구를 사용하여 Visual Studio GPU 사용량 프로파일러를 통해 열린 추적을 수행할 수 있습니다. Windows 성능 도구 키트가 설치된 경우 세션 개요의 오른쪽 아래에 WPA용 하이퍼링크와 GPUView용 하이퍼링크가 있습니다.

    GPU usage.

    이 링크를 통해 GPUView에서 여는 추적은 동기화된 VS 및 GPUView 타임라인 확대/축소 및 이동이 지원됩니다. VS의 확인란은 동기화 사용 여부를 제어합니다.

    GPUView.