C++的可移植性和跨平台开发[4]--硬件体系相关

这次聊的话题主要是和硬件体系有关的。比如你的程序需要支持不同类型的CPU(x86、SPARC、PowerPC),或者是同种类型不同字长的CPU(比如x86和x86-64),这时候你就需要关心一下硬件体系的问题。

  ★基本类型的大小

  C++中基本类型的大小(占用的字节数)会随着CPU字长的变化而变化。所以,假如你要表示一个int占用的字节数,千万不要直接写“4”(顺便说一下,直接写“4”还犯了Magic Number的大忌,详见这里),而应该写“sizeof(int)”;反过来,如果你要定义一个大小必须为4字节的有符号整数,也不要直接用int,要用预先typedef好的定长类型(比如boost库的int32_t、ACE库的ACE_INT32、等)。

  差点忘了,指针的大小也有上述的问题,也要小心。

  ★字节序

  如果你没听说过“字节序”这玩意儿,请看“维基百科”。通俗地打个比方,在一个大尾序的机器上有一个4字节的整数0x01020304,通过网络或者文件传到一台小尾序的机器上就会变成0x04030201;据说还有一种中尾序的机器(不过我没接触过),上述整数会变成0x02010403。

  如果你编写的应用程序中涉及网络通讯,一定要在记得进行主机序和网络序的翻译;如果涉及跨机器传输二进制文件,也要记得进行类似的转换。

  ★内存对齐

  如果你不晓得“内存对齐”是什么东东,请看“维基百科”。简单来说,出于CPU处理上的性能考虑,结构体中的数据不是紧挨着的,而是要空开一些间隔。这样的话,结构体中每个数据的地址正好都是某个字长的整数倍。

  由于C++标准中没有定义内存对齐的细节,因此,你的代码也不能依赖对齐的细节。凡是计算结构体大小的地方,都老老实实写上sizeof()。

  有些编译器支持#pragma pack预处理语句(可以用来修改对齐字长),不过这种语法不是所有编译器都支持,要慎用。

  ★移位操作

  对于有符号整数的右移操作,有些系统默认使用算数右移(最高的符号位不变),有些默认使用逻辑右移(最高的符号位补0)。所以,不要对有符号整数进行右移操作。顺便说一下,即使没有移植性问题,代码中也尽量不要使用移位运算操作,可读性太差。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值