어떻게 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 |