gpt4 book ai didi

c++ - reinterpret_cast<> 和可移植性

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:18:49 24 4
gpt4 key购买 nike

我读过 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++ 代码。任何依赖于该机器细节的代码都是不可移植的。

关于c++ - reinterpret_cast<> 和可移植性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23401489/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com