全站数据
8 4 2 0 5 8 1

char占几个字节

初中生学习方法指导 | 简单学习,快乐成才!         
问题更新日期:2024-10-14 07:00:05

问题描述

char占几个字节,在线求解答
精选答案
最佳答案

字节对齐主要是为了提高内存的访问效率,比如intel 32为cpu,每个总线周期都是从偶地址开始读取32位的内存数据,如果数据存放地址不是从偶数开始,则可能出现需要两个总线周期才能读取到想要的数据,因此需要在内存中存放数据时进行对齐。

通常我们说字节对齐很多时候都是说struct结构体的内存对齐,比如下面的结构体:

在32位机器上char 占1个字节,int 占4个字节,short占2个字节,一共占用7个字节.但是实际真的是这样吗?

我们先看下面程序的输出:

测试输出的结果是A: 12, 比计算的7多了5个字节。这个就是因为编译器在编译的时候进行了内存对齐导致的。

内存对齐主要遵循下面三个原则:

结构体变量的

起始地址

能够被其最宽的成员大小整除

结构体每个成员相对于

起始地址的偏移

能够被其

自身大小整除

,如果不能则在

前一个成员后面

补充字节

结构体总体大小能够

被最宽的成员的大小

整除,如不能则在

后面

补充字节

其实这里有点不严谨,编译器在编译的时候是可以指定对齐大小的,实际使用的有效对齐其实是取指定大小和自身大小的最小值,一般默认的对齐大小是4。

再回到上面的例子,如果默认的对齐大小是4,结构体a的其实地址为0x0000,能够被最宽的数据成员大小(这里是int, 大小为4,有效对齐大小也是4)整除,姑char a的从0x0000开始存放占用一个字节即0x0000~0x0001,然后是int b,其大小为4,故要满足2,需要从0x0004开始,所以在char a后填充三个字节,因此a对齐后占用的空间是0x0000~0x0003,b占用的空间是0x0004~0x0007, 然后是short c其大小是2,故从0x0008开始占用两个字节,即0x0008~0x000A。 此时整个结构体占用的空间是0x0000~0x000A, 占用11个字节,11%4 != 0, 不满足第三个原则,所以需要在后面补充一个字节,即最后内存对齐后占用的空间是0x0000~0x000B,一共12个字节。