我正在嘗試創建一種安全緩衝區,可自動處理沒有任何分支的溢出。緩衝區大小是2的冪,並且只應具有有效的正(即不包括零)索引。它還允許檢查刪除,如果存儲在該索引處的元素等於搜索鍵,則在給定索引處刪除該刪除。無分支溢出處理
我基本上去爲這樣的事情
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時傳入的索引超出範圍,如buffer[0]
不是一個有效的緩衝指數。我也想訪問索引0,只要要移除的元素不等於傳入移除的元素,並且我可能還想訪問索引0(如果緩衝區包含索引處的內容)。
我的問題是:
- 是我真正的網點?因爲如果C編譯器決定使用& &上的短路,則代碼可能會分支。
- 如果& &會導致分支,有沒有替代方案在這種情況下具有相同的行爲,不涉及分支?
- 這可以比基本的溢出檢查更快嗎?或者C編譯器能以某種方式給出
if(index < 256) buffer[index] = elem
的無分支版本?
'&&'按設計短路。它的使用通常會發出一個分支。使用比較運算符的結果作爲值也可能導致分支被髮射,具體取決於體系結構(在x86上它不)。 – fuz
作爲一個概念性問題:想一想,如果超越邊界的讀取和寫入默默無聞,而不是像他們應該崩潰一樣真的會更好。另外認爲如果無分代碼真的值得額外的長度。幾乎從不會很便宜,我認爲你不會偶爾觸發溢出檢查。 – fuz
'&&'不會做你認爲它做的事。例如'&&'的結果只能是'0'或'1'。 – Hurkyl