/Zc:throwingNew(operator new throw 가정)

/Zc:throwingNew 옵션을 지정하면 컴파일러는 null 포인터 반환에 대한 검사 건너뛰도록 operator new 호출을 최적화합니다. 이 옵션은 컴파일러에 연결된 모든 구현 operator new 과 사용자 지정 할당자가 C++ 표준을 준수하고 할당 실패를 throw한다고 가정하도록 지시합니다. 기본적으로 Visual Studio에서 컴파일러는 이러한 호출에 대해 null 검사(/Zc:throwingNew-)를 비관적으로 생성합니다. 사용자가 null 포인터를 반환하는 사용자 지정 할당자 루틴을 operator new throw하지 않는 구현과 연결하거나 작성할 수 있기 때문입니다.

구문

/Zc:throwingNew[-]

설명

ISO C++98 이후 표준은 메모리 할당이 실패할 때 새 기본 연산 자가 throw되도록 지정했습니다 std::bad_alloc . Visual Studio 6.0까지의 Visual C++ 버전은 할당 실패 시 null 포인터를 반환했습니다. Visual Studio 2002 operator new 부터는 표준을 준수하고 실패 시 throw합니다. 이전 할당 스타일을 사용하는 코드를 지원하기 위해 Visual Studio는 실패 시 null 포인터를 반환하는 nothrownew.obj의 operator new 연결 가능한 구현을 제공합니다. 기본적으로 컴파일러는 이러한 이전 스타일 할당자가 실패 시 즉각적인 충돌을 일으키지 않도록 방어 null 검사 생성합니다. /Zc:throwingNew 옵션은 연결된 모든 메모리 할당자가 표준을 준수한다는 가정 하에 이러한 null 검사 제외하도록 컴파일러에 지시합니다. 이는 형식 std::nothrow_t 의 추가 매개 변수를 operator new 사용하여 선언되고 명시적 noexcept 사양이 있는 명시적 throw되지 않는 오버로드에는 적용되지 않습니다.

개념적으로 무료 저장소에 개체를 만들기 위해 컴파일러는 해당 메모리를 할당한 다음 해당 생성자를 호출하여 메모리를 초기화하는 코드를 생성합니다. MSVC 컴파일러는 일반적으로 이 코드가 비준수, throw되지 않는 할당자에 연결되는지 알 수 없으므로 기본적으로 생성자를 호출하기 전에 null 검사 생성합니다. 이렇게 하면 throw되지 않는 할당이 실패할 경우 생성자 호출에서 null 포인터 역참조가 방지됩니다. 대부분의 경우 기본 operator new 할당자가 null 포인터를 반환하는 대신 throw하기 때문에 이러한 검사 필요하지 않습니다. 검사 불행한 부작용도 있습니다. 코드 크기를 블로트하고, 분기 예측자를 가득 채우며, 초기화된 개체에서의 비상화 또는 const 전파와 같은 다른 유용한 컴파일러 최적화를 억제합니다. 검사 nothrownew.obj에 연결하거나 사용자 지정 비준수 operator new 구현이 있는 코드를 지원하기 위해서만 존재합니다. 비규격operator new을 사용하지 않는 경우 /Zc:throwingNew를 사용하여 코드를 최적화하는 것이 좋습니다.

/Zc:throwingNew 옵션은 기본적으로 해제되어 있으며 /permissive- 옵션의 영향을 받지 않습니다.

LTCG(링크 타임 코드 생성)를 사용하여 컴파일하는 경우 /Zc:throwingNew를 지정할 필요가 없습니다. LTCG를 사용하여 코드를 컴파일하는 경우 컴파일러는 기본값인 준수 구현이 사용되는지 검색할 operator new 수 있습니다. 이 경우 컴파일러는 null 검사 자동으로 제외합니다. 링커는 /ThrowingNew 플래그를 검색하여 구현 operator new 이 준수되는지 확인합니다. 사용자 지정 연산자 새 구현에 대한 원본에 이 지시문을 포함하여 링커에 이 플래그를 지정할 수 있습니다.

#pragma comment(linker, "/ThrowingNew")

Visual C++의 규칙과 관련된 문제에 대한 자세한 내용은 Nonstandard Behavior을 참조하세요.

Visual Studio 개발 환경에서 이 컴파일러 옵션을 설정하려면

  1. 프로젝트의 속성 페이지 대화 상자를 엽니다. 자세한 내용은 Visual Studio에서 C++ 컴파일러 및 빌드 속성 설정을 참조하세요.

  2. 구성 드롭다운 메뉴에서 모든 구성을 선택합니다.

  3. 구성 속성>C/C++>명령줄 속성 페이지를 선택합니다.

  4. /Zc:throwingNew 또는 /Zc:throwingNew를 포함하도록 추가 옵션 속성을 수정한 다음 확인을 선택합니다.

참고 항목

MSVC 컴파일러 옵션
MSVC 컴파일러 명령줄 구문
/Zc(규칙)
noexcept(C++)
예외 사양(throw)(C++)
terminate(예외)