32位和64位系统区别及字节对齐

原创 2015年11月18日 19:28:39

(一)64位系统和32位区别?

1、64bit CPU拥有更大的寻址能力,最大支持到16GB内存(因为目前cpu地址总线为34条,条,寻址范围2^10* 2^10* 2^10* 2^4=16G),而32bit只支持4G内存(有32位总线)
2、64位CPU一次可提取64位数据,比32位提高了一倍,理论上性能会提升1倍。但这是建立在64bit操作系统,64bit软件的基础上的。

什么是64位处理器?
之所以叫做“64位处理器”,是因为电脑内部都是实行2进制运算,处理器(CPU)一次处理数据的能力也是2的倍数。8位处理器、16位处理器、32位处理器和64位处理器,其计数都是2的倍数。一次处理的数据越大,该电脑处理信息的能力越来越大;因此64位处理在先天就比32位处理器具有快速的能力。

64位处理器之失
※硬件———缺乏驱动程序,很多现有硬件无法使用
※软件———操作系统不是问题,但是软件出现不兼容难题

64位处理器之得
※硬件———更快的执行速度,更大的内存管理
※软件———最新的尖端软件首先出现在64位平台

(二)数据类型对应字节数

程序运行平台
不同的平台上对不同数据类型分配的字节数是不同的。
个人对平台的理解是CPU+OS+Compiler,是因为:
1、64位机器也可以装32位系统(x64装XP);
2、32位机器上可以有16/32位的编译器(XP上有tc是16位的,其他常见的是32位的);
3、即使是32位的编译器也可以弄出64位的integer来(int64)。
以上这些是基于常见的wintel平台,加上我们可能很少机会接触的其它平台(其它的CPU和OS),所以个人认为所谓平台的概念是三者的组合。
虽然三者的长度可以不一样,但显然相互配合(即长度相等,32位的CPU+32位的OS+32位的Compiler)发挥的能量最大。
理论上来讲 我觉得数据类型的字节数应该是由CPU决定的,但是实际上主要由编译器决定(占多少位由编译器在编译期间说了算)。
常用数据类型对应字节数
可用如sizeof(char),sizeof(char*)等得出
32位编译器:
char :1个字节
char*(即指针变量,只与地址寻址范围有关): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器)
short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 4个字节
long long: 8个字节
unsigned long: 4个字节
64位编译器:
char :1个字节
char*(即指针变量): 8个字节
short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 8个字节
long long: 8个字节
unsigned long: 8个字节

(三)结构体所占内存大小:

为内存优化,一般采用字节对齐。
字节对齐就是变量存储的地址是变量的有效字节对齐值的整数倍,即:
address%最终有效字节对齐值 = 0;
变量字节对齐值
1) 变量的自身字节对齐值
简单类型变量
对于char型数据,其自身对齐值为1,对于short型为2,对于int,float,double类型,其自身对齐值为4,单位字节。
结构类型或联合类型:
自身字节对齐值的大小是其成员中最大基本类型要求的有效字节对齐值
2) 编译器要求的字节对齐值:
编译器设置要求的字节对齐值
3) 最终有效的字节对齐值:
在自身字节对齐值和编译器要求的字节对齐值中取较小的。

其实字节对齐的细节和具体编译器实现相关,但一般而言,满足三个准则:
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除。
2) 结构体每个成员相对于结构体首地址的偏移量都是成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍,如有需要编译器会在成员之间加上填充字节;例如上面第二个结构体变量的地址空间。
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。

ag.1

typedef struct bb
{
 int id;             //[0]....[3]
 double weight;      //[8].....[15]      原则1
 float height;      //[16]..[19],总长要为8的整数倍,补齐[20]...[23]     原则3
}BB;

typedef struct aa
{
 char name[2];     //[0],[1]
 int  id;         //[4]...[7]          原则1

 double score;     //[8]....[15]    
 short grade;    //[16],[17]        
 BB b;             //[24]......[47]          原则2
}AA;

int main()
{
  AA a;
  cout<<sizeof(a)<<" "<<sizeof(BB)<<endl;
  return 0;
}

ag.2

typedef union {char i; int k[2]; char c;} DATE;
struct data { int cat; DATE cow; char dog;} too; 
DATE max;
printf("%d\n",sizeof(too));       //结果为24

共同体中有成员类型 int,所以字节对齐值为4,忽略数组的大小,若为double,字节对齐值为8。

版权声明:转载请注明出处。如有错误,恳请指出!

相关文章推荐

在64位系统以及64位编译器下字节对齐----阿里巴巴2015实习生笔试题

1 2 3 4 5 6 7 8 struct T {     char a;     int *d;     int b;     int c:16;    ...

迁移到64位后的字节对齐问题

sdk在升级到64位编译后在解析本地一个资源文件时出现了bug,对每个字段写入和解析时的偏移位置打出日志,发现其中一个结构体成员变量中少了4字节。 这个结构体大致是这样的: struct no...

C语言字节对齐及设置编译对齐方式方法

一、概念         对齐跟数据在内存中的位置有关。如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐。比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就...
  • edonlii
  • edonlii
  • 2013年10月15日 13:52
  • 15093

64位和32位平台下C/C++结构内存对齐

1. 在 64 位 Linux 下,结构体字段默认按 8 字节对齐;32 位 Linux 下,默认 4 字节对齐。 2. 显示指定对齐方式时,会受到机器字长的约束,即 64 位 Linux 下可以按...

iOS开发之32位与64位,以及结构体对齐访问的问题

首先说32位与64位的问题, 1.之前不清楚iOS是32位还是64位的时候,看见sizeof(int) 打印出来的结果是4的时候,就单纯地以为是32位的系统,即便是看到Mac的“关于本机”里的内存大小...

32位和64位下结构体内存对齐问题

1.先看64位下: #include struct A { int a; char b; double c; char d; };struct B { ...

32位和64位下结构体内存对齐问题

1.先看64位下: #include struct A { int a; char b; double c; char d; }; struct B { ...

C++结构体的定义、初始化和引用

定义: 结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。 声明一个结构体类型的形式是: struct Student{ //声明一个结构体类型Stud...

32位和64位系统区别和数据字节

一、64位系统和32位有什么区别?1、64bit CPU拥有更大的寻址能力。 2、64位CPU一次可提取64位数据,比32位提高了一倍,理论上性能会提升1倍。但这是建立在64bit操作系统,64bi...
  • glDemo
  • glDemo
  • 2015年08月11日 22:36
  • 1856

32位和64位系统区别及int字节数

(一)64位系统和32位有什么区别?http://zhidao.baidu.com/question/100772591.html   1、64bit CPU拥有更大的寻址能力,最大支持到16GB...
  • hfutlsy
  • hfutlsy
  • 2011年10月29日 10:38
  • 3525
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:32位和64位系统区别及字节对齐
举报原因:
原因补充:

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