结构体数据类型的所占字节长度

记录一下结构体的数据类型大小怎么算,主要看对齐数地址偏移量

计算原理

举个例子

#include<iostream>
typedef struct student {
	int num;
	char name[10];//8 byte
	int com, math, english;
	double average;//8 byte
} stu;
stu boy[1000], * p;
int main() {
	std::cout << sizeof(stu)<<"\n";
	std::cout << sizeof(int);
	return 0;
}

对齐数的大小,在vs编译器里,是数据类型大小和默认对齐数(vs是8)的最小值。

从第二个数据开始,数据首个字节的地址的偏移量要为对齐数的整数倍

对于数据类型stu,num先填充4 bytes,之后第二个char name[10]的对齐数是10和8的较小值,为8 bytes,首地址应为8的整数倍的偏移地址量,最小为8,所以从8开始存放name,

第三个数据还是int,现在已经填充了num,4个0xcc,name,加起来偏移地址为18,int对齐数是4,再填充两个0xcc,从偏移地址20开始填充三个int,20+12=32,

第四个数据是double,对齐数是其64位的大小,8bytes,32是8的整数倍,可以直接填入,加起来是40,所以sizeof(stu) 的大小是40

数组的情况是同理的,把他看成几个连续的单个数据算就好了

当结构体中有其他结构体

#include<iostream>
typedef struct student {
	int num;
	char name[10];//8 byte
	int com, math, english;
	double average;//8 byte
} stu;
typedef struct cls {
	int class_number;
	stu one;
};
stu boy[1000], * p;
int main() {
	std::cout << sizeof(stu)<<"\n";
	std::cout << sizeof(cls);
	return 0;
}

stu one 需要从其结构体内部数据的最大对齐数的整数倍的地址偏移量开始,这里内部最大是8,所以应该从cls里的地址偏移量为8开始存储,就是40+8=48。

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值