一,reinterpret_cast<type-id> (expression)
1,它是C++里的强制类型转换符,允许将任意指针转换到其他指针类型,转换时按bit重新解释。因为没有类型检查,所以安全性很低,完全需要使用者确保,同时有Crash的风险。
2,type-id 必须是一个指针、引用、算术类型、函数指针或者成员指针。
3,类似于union,union成员不同的类型,但是共享一块内存,当用union的不同成员时,就是把内存按照不同的类型解释。
二,用途
在项目中遇到的一种用法,用reinterpret_cast封装并传递信息。具体是在多线程处理消息传递派发时,先把数据放到一个mq里,另外一个线程再从mq里取。
数据发送方式:
1,把要传递的信息封装到一个结构体里,
2,new一个构体大小的char数组
3,把该数组reinterpret_cast解释成结构体形式。
4,把包含数据信息的结构赋值到数组解释的结构体
5,发送new的char数组
数据接收方式:
1,接收的char数组,
2,把它reinterpret_cast解释成结构体形式
好处:
1,少了很多数据的赋值等操作,只需要把地址传递过去,效率高。
2,除了数据传递,也可以传递方法函数。灵活性高
坏处:
如果解释错误,会出现Crash
三,部分代码
#include <iostream>
#include <typeinfo>
using namespace std;
void fun1()
{
cout<<"fun1"<<endl;
}
void fun2()
{
cout<<"fun2"<<endl;
}
class TestReinterpret
{
public:
TestReinterpret(void*msg1,void*msg2,int value,char*buffer=NULL)
{
mcontentBuffer = new char[sizeof(struct Messagecontent)/sizeof(int)];
MessageContent* pcontent = reinterpret_cast<MessageContent*>(mcontentBuffer);
pcontent->msg1 = msg1;
pcontent->msg2 = msg2;
pcontent->ma = value;
cout<<"TestReinterpret::construct"<<endl;
}
~TestReinterpret()
{
cout<<"TestReinterpret::disconstruct"<<endl;
}
void*msg1()
{
if(mcontentBuffer!=NULL)
{
Messagecontent *pcontent = reinterpret_cast<MessageContent*>(mcontentBuffer);
return pcontent->msg1;
}
}
void*msg2()
{
if(mcontentBuffer!=NULL)
{
Messagecontent *pcontent = reinterpret_cast<MessageContent*>(mcontentBuffer);
return pcontent->msg2;
}
}
int getValueMa()
{
if(mcontentBuffer!=NULL)
{
Messagecontent *pcontent = reinterpret_cast<MessageContent*>(mcontentBuffer);
return pcontent->ma;
}
}
public:
struct Messagecontent
{
void*msg1;
void*msg2;
int ma;
}
char* mcontentBuffer;
};
int main()
{
TestReinterpret *pt = new TestReinterpret(fun1,fun2,100);
cout<<"Ma: "<<pt->getValueMa();
return 0;
}