重新解释reterpret_cast描述及用法

一,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;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值