이 간단한 코드를 고려하십시오.
void g();
void foo()
{
volatile bool x = false;
if (x)
g();
}
에 대한 잠재적 호출을 최적화 gcc
하거나 clang
최적화 하지는 않습니다 g
. 이것은 내 이해에 맞습니다 : 추상 기계는 volatile
변수가 언제든지 (하드웨어 매핑 등으로 인해) 변경 될 수 있다고 가정해야 하므로 false
초기화에 if
검사 를 지속적으로 접는 것은 잘못 될 것입니다.
그러나 MSVC는 g
전체 호출을 제거합니다 (읽기와 쓰기를 유지함 volatile
). 이 표준 준수 동작입니까?
배경 : 때때로 디버깅 출력을 즉시 켜고 끌 수 있도록 이러한 종류의 구성을 사용합니다. 컴파일러는 항상 메모리에서 값을 읽어야하므로 디버깅 중에 변수 / 메모리를 변경하면 그에 따라 제어 흐름이 수정되어야합니다 . MSVC 출력은 값을 다시 읽지 만 값을 무시합니다 (아마도 일정한 폴딩 및 / 또는 데드 코드 제거로 인해). 물론 내 의도를 상실합니다.
편집 :
읽기와 쓰기의 제거는
volatile
여기서 논의됩니다 : 컴파일러가 로컬 휘발성 변수를 최적화 할 수 있습니까? (나단 감사합니다!). 나는 읽고 쓰는 것이 반드시 일어나야 한다는 표준이 풍부하다고 생각합니다 . 그러나이 논의는 컴파일러가 읽기 결과 를 당연한 것으로 받아들이고이를 기반으로 최적화 하는 것이 합법적인지 여부는 다루지 않습니다 . 나는 이것이 표준에 미달 / 미지정 이라고 가정 하지만 누군가 나를 잘못 입증하면 기쁠 것입니다.물론
x
문제를 회피하기 위해 로컬이 아닌 변수를 만들 수 있습니다 . 이 질문은 호기심에서 벗어납니다.