跨平台开发影响的因素

原创 2007年09月21日 14:48:00
 

如果你正在写从文件或网络读写数据的跨平台C/C++代码,那么你必须明白有些问题是因语言,编译器,平台而不同的。 主要的问题是数据对齐,填充,类型大小,字节顺序和默认状态char是否有符号

对齐

特定机器上,特定的数据被对齐于特定的边界。如果数据没有正确对齐,结果可能是效率降低甚至崩溃。 当你从I/O源读取数据的时候,确保对齐是正确的。详细内容参考本人另一篇blog: 字节对齐的影响因素

填充

"填充" 是数据集合中不同元素之间的间隔, 一般是为了对齐而存在。不同编译器和平台下,填充的数量可能会不同。 不要假设结构的大小和成员的位置在任何编译器和平台下都是相同的。 不要一次性读取或者写入一整个结构体,因为写入的程序可能会使用和读取的程序不同的填充方式。对于域也同样适用。

类型大小

不同数据类型的大小随编译器和平台而不同。 C/C++中, 内置类型的大小完全取决于编译器(在特定范围内). 不要读写大小不明确的数据类型。也就是说,不要读写bool, enum, long, int, short, float, 或者double类型.(译者注:linux下要使用下面跨平台符号,要加载头文件<arpa/inet.h>,此外在C99已经增加了一个头文件stdint.h,支持标准的,可移植的整数类型集合,此文件被包含在<inttypes.h>)

用这些

替代这些...

int8, uint8

char, signed char, unsigned char, enum, bool

int16, uint16

short, signed short, unsigned short, enum

int32, uint32

int, signed int, unsigned int, long, signed long, unsigned long, enum

int64, uint64

long, signed long, unsigned long

int128, uint128

long long, signed long long, unsigned long long

float32

float

float64

double

 

Data TypeRanges

C/C++ recognizes the types shown in the table below.

Type Name

Bytes

Other Names

Range of Values

int

*

signed,
signed int

System dependent

unsigned int

*

unsigned

System dependent

__int8

1

char,
signed char

–128 to 127

__int16

2

short,
short int,
signed short int

–32,768 to 32,767

__int32

4

signed,
signed int

–2,147,483,648 to 2,147,483,647

__int64

8

none

–9,223,372,036,854,775,808 to 9,223,372,036,854,775,807

char

1

signed char

–128 to 127

unsigned char

1

none

0 to 255

short

2

short int,
signed short int

–32,768 to 32,767

unsigned short

2

unsigned short int

0 to 65,535

long

4

long int,
signed long int

–2,147,483,648 to 2,147,483,647

unsigned long

4

unsigned long int

0 to 4,294,967,295

enum

*

none

Same as int

float

4

none

3.4E +/- 38 (7 digits)

double

8

none

1.7E +/- 308 (15 digits)

long double

10

none

1.2E +/- 4932 (19 digits)

 

    The long double data type (80-bit, 10-byte precision) is mapped directly to double (64-bit, 8- byte precision) in Windows NT and Windows 95.

    Signed and unsigned are modifiers that can be used with any integral type. The char type is signed by default, but you can specify /J to make it unsigned by default.

    The int and unsigned int types have the size of the system word. This is two bytes (the same as short and unsigned short) in MS-DOS and 16-bit versions of Windows, and 4 bytes in 32-bit operating systems. However, portable code should not depend on the size of int.

    Microsoft C/C++ also features support for sized integer types. See __int8, __int16, __int32, __int64 for more information. Also see Integer Limits.

       此外,显示个32位与64位平台之间的差异示例:

对于 Linux on POWERILP 32 模型用于 32 位环境中,而 LP64 用于 64 位环境中。这两种模型之间的区别在于长整型和指针的大小。

系统中可以有两种不同的数据类型:基本数据类型和衍生数据类型。

基本数据类型是 C C++ 语言规范定义的所有数据类型。下表对 Linux on POWER Solaris 中的基本数据类型进行了比较:

4:基本数据类型

 

Linux on POWER

Solaris

基本类型

ILP32

LP64

ILP32

LP64

char

8

8

8

8

short

16

16

16

16

init

32

32

32

32

float

32

32

32

32

long

32

64

32

64

pointer

32

64

32

64

long long

64

64

64

64

double

64

64

64

64

long double

64/128*

64/128*

128

128

5. 衍生数据类型

OS

gid_t

mode_t

pid_t

uid_t

wint_t

Solaris ILP32 l

long

unsigned long

long

long

long

Solaris LP64

int

unsigned int

int

int

int

Linux ILP32

unsigned int

unsigned int

int

unsigned int

unsigned int

Linux ILP64

unsigned int

unsigned int

int

unsigned int

unsigned int

 

字节顺序

字节顺序,就是字节在内存中存储的顺序。 不同的处理器存储多字节数据的顺序是不同的。小端处理器由低到高存储(换句话说,和书写的顺序相反).。大端处理器由高到低存储(和书写顺序相同)。如果数值的字节顺序和读写它的处理器不同,它必须被事先转化。同时,为了标准化网络传输的字节顺序,定义了网络字节顺序。详细内容参考本人另一篇blog:  网络通讯中字节排列顺序转化

char - 有符号还是无符号?

一个鲜为人知的事实,char默认可以是有符号的也可以是无符号的-完全取决于编译器。结果导致你从char转化为其他类型的时候(比如int),结果会因编译器而不同。 例如:

char   x;
int    y;
read( fd, &x, 1 );   //
读取一个byte值为
0xff
y = x;               // y
255 或者 -1, 依赖编译器

不要把数据读入一般的char。明确指定是有符号或者无符号的

CPU性能的影响因素:主频和架构

主频和架构对CPU性能的影响同样重要,不能够割裂这两个因素来评估CPU的性能。 主频很容易理解,类似于速度,对于同一种架构的CPU,当然是主频越高CPU的速度就越快。 但是,如果CPU的架构不一样,只...
  • qq_20161893
  • qq_20161893
  • 2017年06月07日 08:32
  • 460

影响分辨率的主要因素

 机器视觉系统中,有一个问题一直困扰大家,那就是分辨率的问题。关于成像系统选型,应遵循以下两个重要原则:(1)镜头的分辨率应高于CCD的分辨率(2)镜头视野应高于CCD视野  ...
  • wazdxm1980
  • wazdxm1980
  • 2007年07月17日 19:55
  • 763

影响GPS定位的5大因素

目前市场中支持定位功能的手机都是通过两种方式来实现定位:     第一是通过内嵌的GPS芯片,接收GPS卫星定位信号;     第二是利用移动运营商基站获取大概的位置;     两种方式混合使用...
  • ilittleone
  • ilittleone
  • 2011年10月08日 19:22
  • 6737

软件性能的影响因素

软件系统的性能表现受到很多因素的影响,主要因素包括硬件设施、网络环境、操作系统、中间件、应用程序、并发用户数、系统数据量等。 软件系统中影响性能的因素有很多,以WEB信息系统为例,会影响整体访问性能...
  • Tongdingsidong
  • Tongdingsidong
  • 2017年07月06日 17:34
  • 166

使用excel进行数据挖掘(2)----分析关键影响因素

使用excel,演示分析关键因素功能。在数据挖掘,机器学习中,常常需要对数据间的影响因素进行分析。...
  • xinxing__8185
  • xinxing__8185
  • 2015年06月12日 12:14
  • 2081

影响磁盘性能的因素

目前磁盘可以分为单碟盘和多碟盘,前者在盘体内只有一张盘片,后者则有多张。每张盘片的正反面都可以存放数据,所以每张盘片需要两个磁头,各读写一面。然而,有一点必须澄清,磁盘每个时刻只允许一个磁盘读写数据。...
  • gg296231363
  • gg296231363
  • 2011年11月24日 14:35
  • 1187

影响算法效率的因素

影响算法效率的因素      1、从大的方面来讲,所选择的语言对算法的效率影响很大。一般来说,使用越高级的语言所需要的时间和空间就越大。另外,不同编译器产生的代码质量不同,这对算法的效率也会有影响。...
  • bcj296050240
  • bcj296050240
  • 2015年05月15日 16:28
  • 1336

影响图像/视频效果的几个因素 ——图像优化的点

http://blog.sina.com.cn/s/blog_ebbe6d790101dawp.html 今天大嘴总结一下,影响图像以及视频效果的主要因素,这里只讲一些特殊的,什...
  • STN_LCD
  • STN_LCD
  • 2017年08月28日 10:58
  • 142

影响数据库性能的因素

论坛上的数据库爱好者们,对于数据库底层的各种细节,内幕,等待事件,隐藏参数等津津乐道,对于调整好一条SQL语句使之在查询优化器/查询引擎下能高性能运转具有巨大的满足感成功感,仿佛自己掌握了天下最有价值...
  • dinglang_2009
  • dinglang_2009
  • 2016年08月24日 21:51
  • 2109

影响软件架构的因素

影响软件架构的因素
  • RodJohnsonDoctor
  • RodJohnsonDoctor
  • 2010年09月24日 19:47
  • 1317
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:跨平台开发影响的因素
举报原因:
原因补充:

(最多只允许输入30个字)