2013-07-08 2 views
0

ANSI-C의 'for'루프가 순서대로 실행되도록 보장 되었습니까? 아니면 순서가 잘못된 실행을 사용하여 컴파일러에서 최적화 할 수 있습니까? 그렇다면 어떤 컴파일러가 그렇게합니까? 어떤 최적화 수준에서? 이 최적화는 어떻게 방지 될 수 있습니까?루프가 C에서 순차적으로 실행되도록 보장됩니까?

+0

이론적으로 코드가 "마술처럼"병렬화되고 각 스레드가 다른 속도로 실행되면 루프가 순서없이 실행될 수 있습니다. 나는 그런 상황을 디버그하는 것이 얼마나 추악한 지 생각해야만했다 ... –

+5

최적화는 올바른 프로그램의 순차적 동작을 변경하는 것이 허용되지 않는다. 그래서 걱정하지 않아도됩니다. – Mysticial

답변

3

컴파일러는 프로그램의 관찰 가능한 동작을 변경하지 않는다고 판단 할 수있는 경우 명령문을 순서대로 실행할 권한이 있습니다. 명령문을 C 추상 기계의 규칙에 따라 엄격하게 실행하려면 volatile 오브젝트를 사용하십시오.

+0

필자가 알고있는 한 volatile은 컴파일러의 힌트이며, 값은 코드의 책임 밖에서 (예 : 병렬 프로세스 또는 하드웨어에 의해) 변경 될 수 있으므로 문제가 될 수있는 최적화가 비활성화됩니다. 그래서 나는 읽기와 쓰기의 순서가 보존되어야한다는 것을 의미한다고 가정합니다 (이것은 특수 함수 레지스터에 대해 의미가 있습니다). 그럴까요? 아마 순서가 맞지 않는 최적화를 사용하는 컴파일러 (및 예)를 알고있을 것입니다. – theldoria

+1

@theldoria C는 휘발성 자격이 부여 된 객체를 포함하는 표현식에 대한 요구 사항을 부과합니다. * (C99, 6.7.3p6) "휘발성 [...]을 갖는 객체. 따라서 그러한 객체를 나타내는 표현식은 다음과 같이 엄격하게 평가됩니다. "* 및 * (C99, 5.1.2.3p8)"에 설명 된 추상 기계의 규칙 "예 1 구현은 추상 의미와 실제 의미간에 일대일 대응을 정의 할 수 있습니다. 모든 시퀀스 포인트에서 실제 개체의 값은 추상 의미에 지정된 값과 일치하므로 휘발성 키워드는 중복 될 것입니다. "* – ouah

+0

@theldoria : '휘발성'한정 개체에 대한 쓰기 및 읽기는 다음과 같은 관찰 가능한 동작의 일부로 간주됩니다. 프로그램이므로 다른 관찰 가능한 행동과 관련하여 프로그램 순서로 수행되어야합니다. – caf

관련 문제