加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – reinterpret_cast <>和portabilty

发布时间:2020-12-16 04:57:18 所属栏目:百科 来源:网络整理
导读:我读过reinterpret_cast如果使用不当可能会很危险.所以我相信我正确使用它;).如果我需要模板类并且需要类型转换,我发现使用它是很好的.但最近我读到了reinterpret_cast也是不便携的.我为这一点感到难过.什么原因?拿下面的代码, void Disp(int* val){ for (i
我读过reinterpret_cast<>如果使用不当可能会很危险.所以我相信我正确使用它;).如果我需要模板类并且需要类型转换,我发现使用它是很好的.但最近我读到了reinterpret_cast<>也是不便携的.我为这一点感到难过.什么原因?拿下面的代码,
void Disp(int* val)
{
    for (int i=0; i < SZ; ++i)
    {
        cout << *(val+i) << " ";
    }
    cout << endl;
}

int main()
{
    int arr[SZ];
    Disp(arr);

    unsigned char* ptr = reinterpret_cast<unsigned char*>(arr);
    for (unsigned char* i = ptr; i < (ptr + (SZ * sizeof(int))); i++)
    {
        *i = 0;
    }
    Disp(arr);
    return 0;
}

现在输出:

1174214872 32767 4196789 0 568392584 58 4196720 0 0 0 
0 0 0 0 0 0 0 0 0 0 

Machine type: Linux 2.6.32-358.11.1.el6.x86_64 #1 x86_64 x86_64 x86_64 GNU/Linux
975580 -16506540 -13369152 0 -4202936 67876 3 -4202836 4 -4202828 
0 0 0 0 0 0 0 0 0 0 

Machine type: SunOS DELPHI 5.10 Generic_142900-01 sun4u sparc SUNW,Netra-240

我已经在Linux和Solaris中复制了同一程序的输出.我是可移植性问题的新手.那么有人可以告诉我,如果我在我的代码中使用这样的东西,会导致任何可移植性问题吗?即使不使用此代码,当代码变得复杂(具有动态分配和所有)并且长时间运行时,是否有机会出现意外(未定义的行为).谢谢您的帮助.

解决方法

reinterpret_cast<>的可移植性问题事实上,不同的CPU在内存中以不同的方式存储数字.有些将它们从最不重要的字节存储到最重要的字节(小端),其他的则完全相反(大端).有些甚至使用一些奇怪的字节顺序,如1 0 3 2,不要问我为什么.

无论如何,这样做的结果是,reinterpret_cast<>只要您不以任何方式依赖字节顺序,它就是可移植的.

您的示例代码不依赖于字节顺序,它将所有字节视为相同(将它们设置为零),因此代码是可移植的.如果你要使用reinterpret_cast<>要在同一台机器上复制一些数据对象而不解释字节,代码也是可移植的(memcpy()会这样做).

不可移植的东西就像查看第一个字节以确定数字的符号(仅适用于大端机器).如果您尝试通过发送reinterpret_cast< char *>的结果将数据从一台计算机传输到另一台计算机,您也遇到了麻烦:目标计算机可能使用与源计算机不同的字节顺序,完全错误解释您的数据.

我会说说reinterpret_cast<>是错误的.它是不可移植的,它只是将机器细节暴露给机器特定的C代码.任何依赖于该机器细节的代码都是不可移植的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读