編譯優(yōu)化生成壞代碼
(金慶的專欄)
以下代碼來自: http://www.gossamer-threads.com/lists/python/dev/497519
#include <stdio.h>
long f(int *a, long *d){
(*d)++;
*a = 5;
return *d;
}
int main()
{
long d = 0;
printf("%ld\n", f((int*)&d, &d));
return 0;
}
用gcc4.1作測試.
g++ main.cpp 結果為5.
打開編譯優(yōu)化選項-O2,
g++ -O2 main.cpp 結果為1.
g++ -O2 main.cpp -Wstrict-aliasing
就會報警告: 提領類型雙關的指針將破壞強重疊規(guī)則.
強重疊就是strict-aliasing.
先轉為void*, 再轉為int*就不會有警告了.
f((int*)((void*)&d), &d)
(金慶的專欄)
以下代碼來自: http://www.gossamer-threads.com/lists/python/dev/497519
#include <stdio.h>
long f(int *a, long *d){
(*d)++;
*a = 5;
return *d;
}
int main()
{
long d = 0;
printf("%ld\n", f((int*)&d, &d));
return 0;
}
用gcc4.1作測試.
g++ main.cpp 結果為5.
打開編譯優(yōu)化選項-O2,
g++ -O2 main.cpp 結果為1.
g++ -O2 main.cpp -Wstrict-aliasing
就會報警告: 提領類型雙關的指針將破壞強重疊規(guī)則.
強重疊就是strict-aliasing.
先轉為void*, 再轉為int*就不會有警告了.
f((int*)((void*)&d), &d)