计算结构体大小

要计算出结构体的大小,首先我们要了解对齐规则

对齐规则:

        1:结构体的第⼀个成员对⻬到和结构体变量起始位置偏移量为0的地址处

        2:其他成员变量要对⻬到某个数字(对⻬数)的整数倍的地址处。

              对⻬数 = 编译器默认的⼀个对⻬数与该成员变量⼤⼩的较⼩值。

               ——vs中默认的值为8

               ——Linux中gcc没有默认对⻬数,对⻬数就是成员⾃⾝的⼤⼩

        3:结构体总⼤⼩为最⼤对⻬数(结构体中每个成员变量都有⼀个对⻬数,所有对⻬数中最⼤的)的 整数倍。

        4:如果嵌套了结构体的情况,嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处,结构体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体中成员的对⻬数)的整数倍。


例1:

 上面列举了一个例子,最终的结果是S1的大小是12,而S2的大小是8,这就是因为存在内存对齐

S1:char c1在起始位置占用1个字节

        int i(对齐数=vs中默认的值8int变量大小4这二者中的较小值=4),由于对齐规则2所以要对齐到4的整数倍的地址处就要浪费3个字节

        char c2跟在int i后面占用1个字节

        目前占用了1+3+4+1=9个字节

        由于对齐规则3,需要是结构体总⼤⼩为最⼤对⻬数的整数倍,该结构体中最大对齐数是4,而9不是4的整数倍,因此还需要浪费3个字节去补齐。因此最终占用12个字节。

S2:char c1在起始位置占用1个字节

        char c2也占用1个字节

        int i由于对齐规则2要对齐到4的整数倍所以要浪费2个字节后再占用4个字节

        目前占用了1+1+2+4=8个字节

        由于符合了对齐规则3,因此不需要再占用额外的字节,最终占用了8个字节


若已知S3占16个字节求S4的大小?

S4:char c1在起始位置占用1个字节

      由于对齐规则4,在嵌套了结构体S3的情况下,需要对齐S3成员中的最大对齐数,也就是double d的对齐数8,因此需要浪费7个字节,在对齐后占用16个字节。

        然后继续根据对齐规则2对齐规则3,最终算出结构体S4占用了32个字节


为什么存在内存对齐?

由于这是一篇主要讲述计算内存大小的文章,我就不过多赘述了。

主要原因有两个

1.平台原因:不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定 类型的数据,否则抛出硬件异常。

2.性能原因:数据结构(尤其是栈)应该尽可能地在⾃然边界上对⻬。原因在于,为了访问未对⻬的内存,处理器需要 作两次内存访问;⽽对⻬的内存访问仅需要⼀次访问。

总体来说:结构体的内存对⻬是拿空间来换取时间的做法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值