类型双关(type punning)经常在需要高性能的代码和网络编程中出现。比如:
- 利用强制类型转换,将
float
和int
互相转换。 - 将
malloc
申请来的内存指针void *
强制类型转换为一个对象的指针类型X *
,并通过该指针访问X
的成员。
然而,C++中的大部分的type punning(包括以上的两种)都会导致undefined behaviour。
我们将解决以下问题:
- type punning 会导致怎样的undefined behaviour?
- type punning 为何会导致undefined behaviour?
- 哪些type punning是正确的,哪些是错误的?
- 当我们必须进行type punning时,如何避免undefined behaviour来实现type punning的功能?