做个笔记,
一下小段代码摘自优快云金庆专栏(传说中的金大师) http://www.cppblog.com/jinq0123/archive/2011/07/13/150830.html ,懒得写例子了。
#include
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作测试.
gcc main.c 结果为5.
打开编译优化选项-O2,
gcc -O2 main.cpp 结果为1.
gcc -O2 main.c -Wstrict-aliasing
就会报警告: 提领类型双关的指针将破坏强重叠规则.
强重叠就是strict-aliasing.
先转为void*, 再转为int*就不会有警告了.
f((int*)((void*)&d), &d)
一下小段代码摘自优快云金庆专栏(传说中的金大师) http://www.cppblog.com/jinq0123/archive/2011/07/13/150830.html ,懒得写例子了。
#include
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作测试.
gcc main.c 结果为5.
打开编译优化选项-O2,
gcc -O2 main.cpp 结果为1.
gcc -O2 main.c -Wstrict-aliasing
就会报警告: 提领类型双关的指针将破坏强重叠规则.
强重叠就是strict-aliasing.
先转为void*, 再转为int*就不会有警告了.
f((int*)((void*)&d), &d)