volatile (C++)

하드웨어에 의해 프로그램에서 수정할 수 있는 개체를 선언하는 데 사용할 수 있는 형식 한정자입니다.

구문

volatile declarator ;

설명

/volatile 컴파일러 스위치를 사용하여 컴파일러가 이 키워드를 해석하는 방법을 수정할 수 있습니다.

Visual Studio 대상 아키텍처에 volatile 따라 키워드를 다르게 해석합니다. ARM의 경우 /volatile 컴파일러 옵션이 지정되지 않은 경우 컴파일러는 /volatile:iso 가 지정된 것처럼 수행됩니다. ARM 이외의 아키텍처의 경우 /volatile 컴파일러 옵션이 지정되지 않은 경우 컴파일러는 /volatile:ms 가 지정된 것처럼 수행합니다. 따라서 ARM 이외의 아키텍처의 경우 /volatile:iso를 지정하고 스레드 간에 공유되는 메모리를 처리할 때 명시적 동기화 기본 형식 및 컴파일러 내장 함수를 사용하는 것이 좋습니다.

한정자를 volatile 사용하여 인터럽트 처리기와 같은 비동기 프로세스에서 사용되는 메모리 위치에 대한 액세스를 제공할 수 있습니다.

__restrict 키워드 volatile 도 있는 변수에 사용되는 경우 volatile 우선합니다.

멤버가 struct 표시 volatilevolatile 되면 전체 구조체로 전파됩니다. 하나의 명령을 volatile 사용하여 현재 아키텍처에서 복사할 수 있는 길이가 구조체에 없는 경우 해당 구조체에서 완전히 손실될 수 있습니다.

volatile 다음 조건 중 하나가 true인 경우 키워드가 필드에 영향을 주지 않을 수 있습니다.

  • volatile 필드의 길이가 현재 아키텍처에서 하나의 명령을 사용하여 복사할 수 있는 최대 크기를 초과합니다.

  • 가장 바깥쪽에 있는 struct길이(또는 중첩 struct된 멤버인 경우)는 하나의 명령을 사용하여 현재 아키텍처에서 복사할 수 있는 최대 크기를 초과합니다.

프로세서는 캐시할 수 없는 메모리 액세스를 다시 정렬하지 않지만 캐시할 수 없는 변수를 표시 volatile 하여 컴파일러가 메모리 액세스의 순서를 다시 지정하지 않도록 해야 합니다.

특정 최적화에서 사용되지 않는 것으로 volatile 선언된 개체는 해당 값이 언제든지 변경될 수 있기 때문입니다. 시스템은 이전 명령이 동일한 개체의 값을 요청하더라도 요청될 때 항상 휘발성 개체의 현재 값을 읽습니다. 또한 개체의 값은 할당 시 즉시 기록됩니다.

ISO 준수

C# volatile 키워드에 익숙하거나 이전 버전의 Microsoft C++ 컴파일러(MSVC)의 volatile 동작에 익숙한 경우 C++11 ISO Standard volatile 키워드가 다르며 /volatile:iso 컴파일러 옵션이 지정된 경우 MSVC 지원됩니다. ARM의 경우 기본적으로 지정됩니다. volatile C++11 ISO 표준 코드의 키워드는 하드웨어 액세스에만 사용되며 스레드 간 통신에는 사용하지 마세요. 스레드 간 통신의 경우 C++ 표준 라이브러리std::atomicT<>와 같은 메커니즘을 사용합니다.

ISO 규칙의 끝

Microsoft 전용

ARM 이외의 아키텍처를 대상으로 하는 경우 / volatile:ms 컴파일러 옵션을 사용하는 경우 컴파일러는 다른 전역 개체에 대한 참조 순서를 유지하는 것 외에도 휘발성 개체에 대한 참조 간의 순서를 유지하기 위해 추가 코드를 생성합니다. 특히 다음 사항에 주의하십시오.

  • volatile 개체 쓰기(volatile 쓰기)는 Release 의미 체계를 사용합니다. 즉 명령 시퀀스에서 volatile 개체에 쓰기 전에 발생하는 전역 또는 정적 개체에 대한 참조는 컴파일된 이진 파일에서 volatile 쓰기 전에 발생합니다.

  • volatile 개체 읽기(volatile 읽기)는 Acquire 의미 체계를 사용합니다. 즉 명령 시퀀스에서 volatile 메모리 읽기 다음에 발생하는 전역 또는 정적 개체에 대한 참조는 컴파일된 이진 파일에서 volatile 읽기 다음에 발생합니다.

이렇게 하면 다중 스레드 애플리케이션에서 메모리 잠금 및 릴리스에 휘발성 개체를 사용할 수 있습니다.

참고

/volatile:ms 컴파일러 옵션을 사용할 때 제공되는 향상된 보장을 사용하는 경우 코드는 이식 가능하지 않습니다.

Microsoft 전용 종료

참조

C++ 키워드
const
const 및 volatile 포인터