内存对齐,大端字节序小端字节序验证-创新互联

空结构体:对于空结构体,就是只有结构体这个模子,但里面却没有元素的结构体。

创新互联建站服务项目包括黄陵网站建设、黄陵网站制作、黄陵网页制作以及黄陵网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,黄陵网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到黄陵省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

例:

typedef struct student

{

}std;

这种空结构体的模子占一个字节,sizeof(std)=1。

柔性数组:

结构体中最后一个元素可以是一个大小未知的数组,称作柔性数组成员,规定柔性数组前面至少有一个元素.

typedef struct student

{

int i;

char arr[];     //柔性数组成员

}std;

sizeof(std)=4;

sizeof求取该结构体大小是不包含柔性数组的大小,柔性数组不管有没有大小都不计入结构体的大小,可以通过动态内存为它实现内存分配。

内存对齐,大端字节   序小端字节序验证内存对齐,大端字节   序小端字节序验证

内存对齐:

对于字(自然边界是偶数地址),双字(自然边界是能被4整除的地址),四字(自然边界是能被8整除的地址)本身就是对齐的。为什么要对齐呢?这是因为对于对齐的内存只需要一次内存访问,对于未对齐的内存,处理器要两次内存访问。

内存对齐,大端字节   序小端字节序验证内存对齐,大端字节   序小端字节序验证

未对齐:一个字或者双字跨越了4字节边界,或者双字跨越了8字节边界,需要两次内存访问。

对于结构体,联合体在计算其大小时要考虑其内存对齐,以结构中所占字节数大的类型类型对齐。

例:

struct test

{

  char a1;

  short b2;

  char  c3;

  int d4;

};

因为其中int类型所占字节最多,所以以4字节对齐,内存分配方式如下,总共占12个字节:

内存对齐,大端字节   序小端字节序验证内存对齐,大端字节   序小端字节序验证

分析:因为以4字节对齐,首先char a1占一个字节存到00处,short b2 是字占两个字节 ,以偶数地址对齐,所以不能直接存到01 02 上,而应该存到02 03上,而空出来的01就会被浪费掉。同理,当char c3存到04上后,对于int i,双字必须要存到4的倍数的地址上,就只能存到08 09 0a 0b上,空出来的05 06 07会被浪费掉。

struct test

{

  char a1;

  char  c3;

  short b2;

  int d4;

};

同样的,以4字节对齐,总共占8个字节:

这是因为a1存到00,c3存到01,b2刚好存到02 03上,以偶数地址对齐,d4也刚好从04开始存储,以4字节对齐,没有浪费内存。

大端字节序:高字节存储在低地址,低字节存储在高字节处

小端字节序:低字节存储在低地址,高字节存储在高地址处

计算机的最小存储单位是字节,一个字节占8bit位。

以int为例:

例如:1的二进制码是

00000000 00000000 00000000 00000001

写成十六进制形式 :00 00 00 01这就代表了4个字节,而内存是从低地址到高地址的,这样就产生了两种存储方式。

内存对齐,大端字节   序小端字节序验证内存对齐,大端字节   序小端字节序验证

因为存储方式方式的不同,读取时也就产生了两种方式。

一般读取是从低地址向高地址读取,为了将存储与读取统一取来,所以采用小端存储,这样的话,低字节存到低地址,高字节存到高地址。

验证方法:

1、可以声明一个int a=1,再声明一个char *p=&a;因为a占4个字节,char *一次向后访问一个字节,所以如果是小端的话在电脑上输出*p应该是1.

2、也可以用union,因为union是内存公用,所以声明一个int a,char c;对a赋值为1,输出c观察结果。

有些问题如果不考虑大小端的话是根本想不明白的。

创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。


本文名称:内存对齐,大端字节序小端字节序验证-创新互联
新闻来源:http://azwzsj.com/article/dcsecd.html