问题分析
- 原因由于强制类型转换导致出现的warning
- GCC 4 编译警告:warning: dereferencing type-punned pointer will break strict-aliasing rules
- 有一个指针用作了不同的类型,编译器告诉你如果坚持这样做,它不能做编译优化
#include <iostream>
int main() {
void *p = nullptr;
float f = 0.01;
*(float *)(&p) = f; //warning pointer aliasing
std::cout << "p = " << p << std::endl;
float f2 = *(float *)(&p);
std::cout << "f2 = " << f2 << std::endl;
}
消除warning方法小结
- 给相关类型加上attribute((may_alias))。
- 加编译选项,不进行严格检查 。-fstrict-aliasing 和 -Wstrict-aliasing
- void * 作为中间变量
struct ParaType{
int age;
bool gender;
...
};
//关键代码如下
char my_para[128];
void * tmp_ptr = my_para;
ParaType* my_para = reinterpret_cast<ParaType*>(tmp_ptr);
/*
* 作者:magicstone
* 链接:https://www.zhihu.com/question/19707376/answer/292424346
* 来源:知乎
* 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
*/
- 最终使用memcpy 替换 强制转换,达到相同的目的。