typedef struct {
void * field1;
} s1;
void func1(void) {
s1 my_s1;
s1 * __restrict my_s1_ptr = &my_s1;
*((int*)((char*)my_s1_ptr->field1 + 4)) = 0;
*((int*)((char*)my_s1_ptr->field1 + 8)) = 1;
*((int*)((char*)my_s1_ptr->field1 + 12)) = 2;
*((int*)((char*)my_s1_ptr->field1 + 16)) = 3;
}
인텔 컴파일러 버전 11.1 및 gcc 버전 4.6의 경우 컴파일러에서 마지막 4 개 문 각각에 대해 my_s1_ptr-> field1을 다시로드하는 것으로 보입니다. __restrict에 대한 나의 이해는 나에게 마지막 3 개의 부하가 중복되어야하고 제거 될 수 있다고 제안합니다. 네, 코드가 이상하다는 것을 압니다 만,이 방법으로 구조화 된 이유가 있습니다. 중복로드를 제거하기 위해 컴파일러를 얻을 수 있기를 바랍니다. 그걸 어떻게하도록 설득 시키는가?c99 __restrict 및 컴파일러 최적화
최적화를 사용하여 컴파일 했습니까? 그리고 왜 C99 키워드 인'restrict'보다는'__restrict'를 사용하고 있습니까? –
최적화로 컴파일했는데 __restrict와 restrict는 큰 차이가 없습니다. – DrTodd13
난 구조체에 대한 포인터 대신 필드에 대한 포인터에 대해 여러 변형을 시도했지만 아무 것도 변경하지 않았다. 실제 코드에서는 field1이 가리키는 필드를 가리키는 포인터가 여러 개있을 수 있으므로 field1에 restrict를 추가하는 것은 유효하지 않습니다.하지만로드를 제거하지는 않았지만 시도해 보았습니다. field1을 제한 지역 변수 포인터에 복사하면 중복로드가 제거되지만이 방법은 프로그램의 의미를 위반한다고 말합니다. – DrTodd13