陣列我有這樣的功能:嚴格混疊和在C
static void doSomething(int16_t array[256], int16_t mask, uint8_t skip){
uint16_t storage = array[skip];
uint64_t* array1=(uint64_t*)(array);
uint64_t mask1 =0;
uint16_t* Lmask=(uint16_t*)&mask1;
Lmask[0]=mask;
Lmask[1]=mask;
Lmask[2]=mask;
Lmask[3]=mask;
int k;
for (k =0 ; k < 64; k++) {
array1[k]&=mask;
array[skip]=storage;
if(hasZero(array1[k])){
...
}
}
應該採取的16位整數的數組,在其上施加一個掩模,並檢查,是否它包含一個16位的整數等於零那不在跳過位置,如果是的話,做一些事情。它一切正常,直到使用-O2優化(-O1,-Os正常運行)。
該函數被稱爲數十萬次,因此它不能使用16位掩碼和16位數組。我想,問題是,這個代碼打破了嚴格的別名規則。有什麼辦法可以對編譯器說,array1和array使用相同的內存位置,因此它在評估if語句之前不能忽略array[skip]=storage;
(我嘗試過union,但是沒有成功,它完全一樣如現在)?或者有沒有其他方法可以做到這一點,它不會違反這條規則?
但是你真的需要O2嗎? – MightyPork 2014-11-22 12:45:49
就像我這樣做是不幸的,整個項目都是使用-O2編譯的,我不能反對它。 – Rasty 2014-11-22 12:47:43
您的文本顯示'g ++'但您的q被標記了[tag:C] – 2014-11-22 12:49:33