大佬教程收集整理的这篇文章主要介绍了c – reinterpret_cast <>和portabilty,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
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<>只要您不以任何方式依赖字节顺序,它就是可移植的.
您的示例代码不依赖于字节顺序,它将所有字节视为相同(将它们设置为零),因此代码是可移植的.如果你要使用reinterpret_cast<>要在同一台机器上复制一些数据对象而不解释字节,代码也是可移植的(memcpy()会这样做).
不可移植的东西就像查看第一个字节以确定数字的符号(仅适用于大端机器).如果您尝试通过发送reinterpret_cast< char *>的结果将数据从一台计算机传输到另一台计算机,您也遇到了麻烦:目标计算机可能使用与源计算机不同的字节顺序,完全错误解释您的数据.
我会说说reinterpret_cast<>是错误的.它是不可移植的,它只是将机器细节暴露给机器特定的C代码.任何依赖于该机器细节的代码都是不可移植的.
以上是大佬教程为你收集整理的c – reinterpret_cast <>和portabilty全部内容,希望文章能够帮你解决c – reinterpret_cast <>和portabilty所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。