[c] gcc가 C에서 일부 명령문을 최적화하는 것을 방지하는 방법은 무엇입니까?

페이지를 더티하게 만들기 위해 (페이지 테이블 항목에서 더티 비트로 전환) 다음과 같이 페이지의 첫 번째 바이트를 터치합니다.

pageptr[0] = pageptr[0];

그러나 실제로 gcc는 데드 스토어 제거에 의한 명령문을 무시합니다. gcc 최적화를 방지하기 위해 다음과 같이 문을 다시 작성합니다.

volatile int tmp;
tmp = pageptr[0];
pageptr[0] = tmp;

트릭이 작동하는 것처럼 보이지만 다소 추합니다. 동일한 효과를 갖는 지시문이나 구문이 있는지 알고 싶습니다. 그리고 나는 -O0플래그 를 사용하고 싶지 않습니다 . 왜냐하면 그것은 또한 큰 성능 저하를 가져올 것이기 때문입니다.



답변

최적화를 해제하면 문제가 해결되지만 불필요합니다. 더 안전한 대안은 컴파일러가 volatile형식 한정자 를 사용하여 저장소를 최적화하는 것을 불법으로 만드는 것 입니다.

// Assuming pageptr is unsigned char * already...
unsigned char *pageptr = ...;
((unsigned char volatile *)pageptr)[0] = pageptr[0];

volatile컴파일러에 지시 타입 한정자는 메모리 저장 및로드에 대한 엄격합니다. 의 한 가지 목적은 volatile메모리 액세스에 부작용이 있으므로 유지되어야 함을 컴파일러에 알리는 것입니다 . 이 경우 저장소는 페이지 오류를 유발하는 부작용이 있으며 컴파일러가 페이지 오류를 보존하기를 원합니다.

이렇게하면 주변 코드를 계속 최적화 할 수 있으며 코드를 GCC #pragma또는 __attribute__구문을 이해하지 못하는 다른 컴파일러로 이식 할 수 있습니다.


답변

당신이 사용할 수있는

#pragma GCC push_options
#pragma GCC optimize ("O0")

your code

#pragma GCC pop_options

GCC 4.4 이후 최적화를 비활성화합니다.

자세한 내용은 GCC 문서를 참조하십시오.


답변

새 pragma를 사용하는 대신 __attribute__((optimize("O0")))필요에 따라 사용할 수도 있습니다 . 이는 동일한 파일에 정의 된 모든 기능이 아닌 단일 기능에만 적용하는 이점이 있습니다.

사용 예 :

void __attribute__((optimize("O0"))) foo(unsigned char data) {
    // unmodifiable compiler code
}


답변