ANSI-C의 'for'루프가 순서대로 실행되도록 보장 되었습니까? 아니면 순서가 잘못된 실행을 사용하여 컴파일러에서 최적화 할 수 있습니까? 그렇다면 어떤 컴파일러가 그렇게합니까? 어떤 최적화 수준에서? 이 최적화는 어떻게 방지 될 수 있습니까?루프가 C에서 순차적으로 실행되도록 보장됩니까?
답변
컴파일러는 프로그램의 관찰 가능한 동작을 변경하지 않는다고 판단 할 수있는 경우 명령문을 순서대로 실행할 권한이 있습니다. 명령문을 C 추상 기계의 규칙에 따라 엄격하게 실행하려면 volatile
오브젝트를 사용하십시오.
필자가 알고있는 한 volatile은 컴파일러의 힌트이며, 값은 코드의 책임 밖에서 (예 : 병렬 프로세스 또는 하드웨어에 의해) 변경 될 수 있으므로 문제가 될 수있는 최적화가 비활성화됩니다. 그래서 나는 읽기와 쓰기의 순서가 보존되어야한다는 것을 의미한다고 가정합니다 (이것은 특수 함수 레지스터에 대해 의미가 있습니다). 그럴까요? 아마 순서가 맞지 않는 최적화를 사용하는 컴파일러 (및 예)를 알고있을 것입니다. – theldoria
@theldoria C는 휘발성 자격이 부여 된 객체를 포함하는 표현식에 대한 요구 사항을 부과합니다. * (C99, 6.7.3p6) "휘발성 [...]을 갖는 객체. 따라서 그러한 객체를 나타내는 표현식은 다음과 같이 엄격하게 평가됩니다. "* 및 * (C99, 5.1.2.3p8)"에 설명 된 추상 기계의 규칙 "예 1 구현은 추상 의미와 실제 의미간에 일대일 대응을 정의 할 수 있습니다. 모든 시퀀스 포인트에서 실제 개체의 값은 추상 의미에 지정된 값과 일치하므로 휘발성 키워드는 중복 될 것입니다. "* – ouah
@theldoria : '휘발성'한정 개체에 대한 쓰기 및 읽기는 다음과 같은 관찰 가능한 동작의 일부로 간주됩니다. 프로그램이므로 다른 관찰 가능한 행동과 관련하여 프로그램 순서로 수행되어야합니다. – caf
- 1. CacheItemRemovedCallback이 실행되도록 보장됩니까?
- 2. 응용 프로그램 요청이 완료된 후 ndb async가 실행되도록 보장됩니까?
- 3. OData 쿼리의 경우 $ skip보다 먼저 $ filter가 실행되도록 보장됩니까?
- 4. AsyncTask : onProgressUpdate를 호출 한 후 onPostExecute가 실행되도록 보장됩니까?
- 5. 해당 요소에서 요소를 대체하는 경우 나머지 JavaScript가 실행되도록 보장됩니까?
- 6. 순차적 chrome.tabs.executeScript 호출에 전달 된 코드가 순서대로 실행되도록 보장됩니까?
- 7. For 루프가 C에서 분쇄됩니다
- 8. 루프가 C에서 작동하지 않습니다.
- 9. gpu에서 루프가 순차적으로 또는 병렬로 실행됩니까?
- 10. 치료 중 루프가 순차적으로 실행되고 있지 않습니다.
- 11. C에서 이중 부정 : 0/1을 반환하도록 보장됩니까?
- 12. foreach 정의가 스칼라에서 주제 컬렉션을 순차적으로 반복하도록 보장됩니까?
- 13. 루프가 C에서 예상보다 많이 실행됩니다.
- 14. C에서 순차적으로 4092 개 파일 열기
- 15. GC.SuppressFinalize는 보장됩니까?
- 16. 순차적으로
- 17. 순차적으로
- 18. C에서 비동기로 구성된 while 루프가 깨어짐
- 19. C에서 무한 루프가 scanf에 대해 멈추지 않습니다
- 20. While 루프가 C에서 제대로 작동하지 않습니다.
- 21. C에서는 1/2 == 0이 보장됩니까?
- 22. 은 작업자가 마지막으로 SwingWorker.process()를 호출 한 후 SwingWorker.done()이 실행되도록 보장됩니까?
- 23. HTML 문서의 머리 부분에있는 외부 스크립트가 본문에 포함 된 스크립트보다 먼저 실행되도록 보장됩니까?
- 24. MIDlet.startApp()는 MIDlet.pauseApp() 또는 MIDlet.destroyApp()가 호출되기 전에 완전히 실행되도록 보장됩니까?
- 25. Sleep을 사용하면 Thread의 실행 순서가 보장됩니까?
- 26. 벡터 포인터 위치가 보장됩니까?
- 27. std :: cout 초기화가 보장됩니까?
- 28. 유형 안전성은 어떻게 보장됩니까?
- 29. IBOutletCollection은 올바른 순서로 보장됩니까?
- 30. bool은 1 바이트로 보장됩니까?
이론적으로 코드가 "마술처럼"병렬화되고 각 스레드가 다른 속도로 실행되면 루프가 순서없이 실행될 수 있습니다. 나는 그런 상황을 디버그하는 것이 얼마나 추악한 지 생각해야만했다 ... –
최적화는 올바른 프로그램의 순차적 동작을 변경하는 것이 허용되지 않는다. 그래서 걱정하지 않아도됩니다. – Mysticial