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
}
참고 URL : https://stackoverflow.com/questions/2219829/how-to-prevent-gcc-optimizing-some-statements-in-c
'Programing' 카테고리의 다른 글
"adb 서버 버전이이 클라이언트와 일치하지 않습니다"오류 해결 (0) | 2020.08.27 |
---|---|
RecyclerView.State를 사용하여 RecyclerView의 스크롤 위치를 저장하는 방법은 무엇입니까? (0) | 2020.08.27 |
GSON을 사용하여 JSON 스타일 속성 이름을 Java CamelCase 이름으로 변환 (0) | 2020.08.27 |
아래 디렉토리를 파지 않고 os.walk (0) | 2020.08.27 |
NSString에서 문자를 제거 하시겠습니까? (0) | 2020.08.27 |