programing

어떻게 gcc가 C의 일부 문구를 최적화하는 것을 방지할 수 있는가?

prostudy 2022. 4. 18. 21:21
반응형

어떻게 gcc가 C의 일부 문구를 최적화하는 것을 방지할 수 있는가?

페이지를 더럽히기 위해(페이지 테이블 항목의 더티 비트로 전환) 다음과 같이 페이지의 첫 번째 바이트를 터치한다.

pageptr[0] = pageptr[0];

그러나 실제로 gcc는 죽은 상점들을 제거함으로써 그 진술을 무시할 것이다.gcc가 최적화하는 것을 방지하기 위해 다음과 같이 다시 작성한다.

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

그 속임수는 효과가 있는 것 같지만, 다소 추하다.같은 효과를 내는 지시나 구문이 있는지 알고 싶다.그리고 나는 a를 사용하고 싶지 않다.-O0플래그, 왜냐하면 그것은 또한 큰 성능 저하를 가져올 것이기 때문이다.

사용할 수 있다

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

your code

#pragma GCC pop_options

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

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

새로운 실용주의 대신에, 당신은 또한 사용할 수 있다.__attribute__((optimize("O0")))당신의 필요를 위해서.이는 동일한 파일에 정의된 모든 기능이 아닌 단일 기능에만 적용할 수 있는 장점이 있다.

사용 예제:

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

최적화를 끄면 문제가 해결되지만 불필요하다.보다 안전한 대안은 컴파일러가 제품을 사용하여 스토어를 최적화하는 것을 불법으로 만드는 것이다.volatile활자 한정자

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

volatile형식 한정자는 컴파일러가 메모리 저장 및 로드에 대해 엄격하도록 지시한다.의 한 가지 목적volatile컴파일러에게 메모리 액세스가 부작용을 가지므로 반드시 보존해야 한다는 것을 알리는 것이다.이 경우, 상점은 페이지 결함을 유발하는 부작용이 있으며, 당신은 컴파일러가 페이지 결함을 보존하기를 원한다.

이렇게 하면 주변 코드는 여전히 최적화될 수 있으며, 당신의 코드는 GCC의 코드를 이해하지 못하는 다른 컴파일러로 이동 가능하다.#pragma또는__attribute__구문.

참조URL: https://stackoverflow.com/questions/2219829/how-to-prevent-gcc-optimizing-some-statements-in-c

반응형