以下兩段代碼可以在優化級別爲-o0時正常工作。 但是,當優化級別是-o0以外的任何其他優化級別時,第一個代碼在某個點崩潰,但秒不會崩潰。你能解釋爲什麼嗎?在iOS中的-o0以外的任何優化級別發生崩潰當優化級別爲-o0時,以下兩段代碼可以正常工作
1.
unsigned char* _pos = ...;
double result;
*((int*)&result) = *((int*)_pos;
2.
unsigned char* _pos = ...;
double result;
int* curPos = (int*)_pos;
int* resultPos = (int*)&result;
*resultPos = *curPos;
編輯: 順便說,這個代碼是在一個內聯函數。如果函數未內聯,即使進行優化,也不會崩潰。
爲什麼不使用調試器並找出自己? :-) – 2012-02-24 13:36:29
我做了 - 沒有發現問題 – 2012-02-24 13:38:29
1和2都打破了嚴格的別名規則。編譯器可以並且會生成崩潰代碼,並生成不會崩潰的代碼。關於這個真的沒什麼可說的。 http://stackoverflow.com/questions/98650/what-is-the-strict-aliasing-rule – 2012-02-24 13:45:40