분기없이 자동으로 오버플로를 처리하는 안전한 버퍼 유형을 만들려고합니다. 버퍼 크기는 2의 거듭 제곱이며 유효한 양수 (즉, 0을 포함하지 않음) 색인 만 가져야합니다. 또한 해당 인덱스에 저장된 요소가 검색 키와 동일한 경우 지정된 색인에서 제거되는 확인 된 제거를 허용합니다. 분기없는 오버플로 처리
나는 기본적으로 전달 된 인덱스가 범위를 벗어마다buffer[0]
유효한 버퍼 인덱스가 아닙니다 그래서 나는 기본적으로 인덱스 0에 액세스하려면이
Element *buffer[256];
inline void buffer_insert(size_t index, Element *elem){
buffer[index < 256 && index] = elem;
}
//Optional: checked insert to prevent overwrite. Will only insert
//if the buffer holds NULL at index.
inline void buffer_checkedInsert(size_t index, Element * elem){
buffer[index && !buffer[index < 256 && index]] = elem;
}
inline void buffer_checkedRemove(size_t index, Element *elem){
buffer[0] = NULL; //Maybe useful if buffer[0] stores elem
buffer[((elem == buffer[index < 256 && index)) && index] = NULL;
}
처럼 뭔가를 가고 있었다. 또한 제거 할 요소가 제거로 전달 된 요소와 같지 않을 때마다 인덱스 0에 액세스하려고합니다. 버퍼에 인덱스가 포함되어 있으면 인덱스 0에 액세스 할 수도 있습니다.
내 질문은 :
- 난 정말 무점포이 무엇인가? C 컴파일러가 & &의 단락 회로를 사용하기로 결정하면 코드가 분기 될 수 있습니다.
- & &으로 인해 분기가 발생하는 경우 분기와 관련없는 동일한 동작을하는 대체 방법이 있습니까?
- 기본 오버플로 검사보다 빠를 수 있습니까? 또는 C 컴파일러가 어떻게 든
if(index < 256) buffer[index] = elem
의 분기없는 버전을 제공 할 수 있습니까?
'&&'는 설계 상으로 단락되어 있습니다. 그것의 사용은 일반적으로 가지를 방출한다. 비교 연산자의 결과를 값으로 사용하면 아키텍처에 따라 분기가 생성 될 수도 있습니다 (x86에서는 그렇지 않음). – fuz
개념적 질문 : 범위를 벗어난 읽기 및 쓰기를 사용하는 것이 정상적으로 충돌하는 것보다 자동으로 더 나은지 생각하십시오. 또한 branchless 코드가 실제로 추가 길이만한 가치가 있는지 생각해보십시오. 점프는 거의 절대적으로 적게 받아 들여지는 경우가 종종 있습니다. 오버플로 확인을 가끔씩 수행 할 것이라고 생각하지 않습니다. – fuz
'&&'는 당신이 생각하는대로하지 않습니다. 예 : '&& '의 결과는 단지'0' 또는'1' 일 수 있습니다. – Hurkyl