字节对齐

转自:https://blog.csdn.net/lz20120808/article/details/49910659

(一)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;//48 24
  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));//16
printf("%d\n", sizeof(max));//8
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值