2013-11-01 3 views
2

I의 구조는 다음과 같습니다`restrict` 키워드가 내포하는 엄격한 앨리어싱 수준은 무엇입니까?

typedef struct{ 
    int data[LENGTH]; 
}Data; 

을 등처럼 사용

Data* dt=CALLOC(...) 

int foo(Data* restrict d){ 
    for(...) 
     d[i]->data[j]; 
    //do stuff with data[] 
} 

내 질문은 : 또한 그 구성원에 영향을 d에서 엄격한 앨리어싱을 제거 하는가 아니면 내가에 restrict를 사용해야 할 그들을 별도로? 다시 말하면, restrict모두 구조체에 포함 된 포인터가 동일한 처리를 받습니까?

편집 : 구조체에 대한 포인터가 restrict 에드을 얻는 경우에 (내 예제의 경우처럼) 나는, 그 안에 포함 된 다른 포인터뿐만 아니라 제한 될 것이라고 의미 앨리어싱의 수준으로.

+4

'restrict'는 엄격한 앨리어싱이 아닙니다. –

+0

내가 오해 한 것 같습니다. 'restrict'의 목적은 무엇입니까? – rath

+0

'restrict'는 근본적으로 프로그래머가 포인터가 포인터가 가리키는 저장소에 액세스하는 유일한 포인터라는 약속입니다. – gsg

답변

4

restrict은 포인터를 통해 검색된 값이 아닌 주석 된 포인터 자체 (또는 포인터 연산과 같이 포인터에서 생성 된 포인터)에만 적용됩니다.

'엄격한 앨리어싱 수준'이 의미하는 바는 확실하지 않지만 restrict은 엄격한 앨리어싱보다 더 강력한 약속입니다. 엄격한 앨리어스 (aliasing)는 호환 가능한 타입의 포인터가 앨리어스 (alias) 할 수있게합니다 : restrict은 앨리어스가 전혀 없다는 약속입니다.

+0

'restrict'의 핵심은 컴파일러가 함수가'restrict' 한정 포인터를 받으면 포인터의 복사본이나 그로부터 만들어진 다른 복사본으로 수행 된 모든 것을 볼 수 있다고 가정 할 수 있다는 것입니다. 불투명 한 함수 나 알 수없는 출처의 포인터에 대한 액세스가있는 경우에도 해당 포인터로 식별 된 것에 대한 모든 액세스를 시스템의 다른 것과 비교하여 순서가없는 것으로 취급 할 수 있습니다. – supercat

관련 문제