int i;
int *p;
p = &i;
*p = 2;
這時 p 就稱作 i 的 alias,因為它們指到記憶體裡的同一個地方。用 p 修改值會修改到 i 的值。它們共用一個記憶體位置存資料,這時 p 就是 i 的 alias。
gcc 所指的 strict aliasing 是指在 C99 裡,不允許 pointer 指到不同型別的變數。比方說
int i;
char *p;
p = &i;
這個程式在編譯時就會有 warning 發生。
C99 這樣的立意是從程式語言的角度,避免誤用的發生。但是由於 C 的彈性,它也被用在撰寫很多系統程式。而這些系統程式通常都會有共用結構的問題,甚至要跳過程式語言的層次直接存取記憶體裡的資料結構,aliasing 並不見得都壞事。因此在 如 linux kernel 或 freebsd 等的 makefile 裡,通常會加上 -fno-strict-aliasing 來讓這個有點囉嗦的管家安靜一點。這時程式本身在寫的時候,就得特別小心了。其實寫系統相關的東西本來就要有這種覺悟。
Ref:
Understanding Strict Aliasing
後記:
在看 freebsd-current 關於 gjournal 的相關討論時提到,所以把它找出來弄個清楚。
沒有留言:
張貼留言