如何计算结构体对象的大小

本文介绍了C/C++中结构体对象大小的计算规则,包括内存对齐的原则,并通过实例详细解释了如何计算结构体的大小。内容涉及结构体成员的内存偏移与对齐,以及如何通过代码验证结构体的内存分布。
摘要由CSDN通过智能技术生成

如何计算结构体对象的大小


今天在处理结构体对象的时候,发现自己一直以为的结构体对象的内存对齐只会在最后对齐是错误的理解,于是在知乎中看了 这篇回答后,把这种错误理解纠正了过来,现在就来写个博客记录一下。

在C/C++中,结构体对象的大小不一定等于成员变量所占的内存空间之和,这是由于内存对齐的存在,在计算结构体对象的大小时需要遵循以下三个原则所导致的:

	1. 结构体变量的起始地址能够被其最宽的成员大小整除
	2. 结构体每个成员相对于起始地址的偏移能够被其自身大小整除,如果不能则在前一个成员后面补充字节
	3. 结构体总体大小能够被最宽的成员的大小整除,如不能则在后面补充字节

我们先来看第一个例子

struct
{
   	
	int  a;
	char b;
	char c;
}

第一个例子的结构体对象的大小是多少个字节呢?6个字节?不对,是8个字节。由于在上面的结构体当中,最宽的成员变量a占有了4个字节,根据第三个原则:结构体总体大小能够被最宽的成员的大小整除,如不能则在后面补充字节,6%4 != 0,所以需要在结构体的最后补齐2个字节,即8个字节。

我们再来看看第二个例子

struct
{
   
	char a;
	int b;
	char c;
}

这不是跟上面第一个例子一模一样吗?只是成员变量的顺序换了。那么这个结构体对象的大小是多少个字节呢?8个?不对,是12个。
由于在第二个例子的结构体中,第一个是成员变量是char,第二个成员变量是int,所以根据第二个原则:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C语言中,结构体是一种自定义的数据类型,可以包含多个不同类型的成员变量。要比较两个结构体大小,可以通过比较结构体的成员变量来实现。 比较结构体大小的一种常见方法是逐个比较结构体的成员变量。按照成员变量的顺序进行比较,如果两个结构体的对应成员变量相等,则继续比较下一个成员变量,直到找到不相等的成员变量或者比较完所有成员变量。 需要注意的是,C语言中的结构体不能直接使用比较运算符进行比较,因为结构体是复合类型,无法直接进行大小比较。因此,需要自定义比较函数来实现结构体大小比较。 下面是一个示例代码,演示了如何比较两个结构体大小: ```c #include <stdio.h> // 定义一个结构体 struct Person { char name[20]; int age; }; // 自定义比较函数 int compare(struct Person p1, struct Person p2) { if (p1.age > p2.age) { return 1; } else if (p1.age < p2.age) { return -1; } else { return 0; } } int main() { // 创建两个结构体对象 struct Person person1 = {"Alice", 25}; struct Person person2 = {"Bob", 30}; // 调用比较函数进行比较 int result = compare(person1, person2); if (result > 0) { printf("%s 大于 %s\n", person1.name, person2.name); } else if (result < 0) { printf("%s 小于 %s\n", person1.name, person2.name); } else { printf("%s 等于 %s\n", person1.name, person2.name); } return 0; } ``` 运行以上代码,输出结果为: ``` Alice 小于 Bob ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值