结构体大小和对齐值

1,基本变量的大小和对齐值

基本变量的大小就不用说了,char 1 int 4 double 8 等等。

基本变量的对齐值,就是他的大小。

代码:

    int n;
    int *p=&n;
    cout<<p;

输出的值一定是4的倍数,因为int变量的对齐值是4,这样做是为了让数据的处理效率更高,因为计算机是一次读取4个字节的。

也就是说,基本变量的地址,是其对齐值的倍数。

 

2,结构体的大小和对齐值

有3条规则:

1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2) 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。

也可以这么理解:

首先,结构体的对齐值是所有成员的最大对齐值。

其次,结构体的第一个成员的地址必须是结构体的对齐值的倍数,按照“基本变量的地址是其对齐值的倍数”这个原则依次确定每个变量的地址。

最后,结构体的大小是结构体的对齐值的倍数。

 

3,结构体的嵌套

结构体嵌套时,不能按照展开处理,而是把内层的结构体变量当做基本变量,它的大小和对齐值按照上述方法计算。

这个场景让我们更清楚的认识到,结构体成员地址是它的大小的倍数这句话是错的,应该是结构体成员地址是它的对齐值的倍数

 

4,pragma指定对齐值

如果pragma pack指定了对齐值,那么基本变量的对齐值,就是他的大小和指定对齐值中较小的数。

确定了基本变量的对齐值之后,还是按照我上面说的规则确定结构体的大小和对齐值。

 

5,空数组成员

struct n1
{
    char c;
    int x[0];
};
struct n2
{
    int c;
    int x[0];
};
struct n3
{
    char c;
    int x[];
};
struct n4
{
    int c;
    int x[];
};

4个结构体的大小都是4

struct n1
{
    char c;
    char x[0];
};
struct n2
{
    int c;
    char x[0];
};
struct n3
{
    char c;
    char x[];
};
struct n4
{
    int c;
    char x[];
};

4个结构体的大小分别是1 4 1 4

也就是说,空数组是一种大小为0的变量类型,他的对齐值和数组成员的对齐值一样。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值