어떻게 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
'programing' 카테고리의 다른 글
InputStream을 Java의 String으로 읽거나 변환하는 방법 (0) | 2022.04.18 |
---|---|
VueJ를 사용하여 테이블에서 행 제거s (0) | 2022.04.18 |
왜 변수 이름들은 종종 'm'자로 시작하는가? (0) | 2022.04.18 |
소품으로 전달된 배열에서 객체를 어떻게 반응적으로 제거하여 DOM에 반영할 수 있는가? (0) | 2022.04.18 |
javascript와 vue를 사용하여 객체를 어레이에 추가할 때 어떻게 해야 하는가? (0) | 2022.04.18 |