结构体大小和类大小的计算

1、结构体大小的计算

  • 当为空结构体时,其大小为1
  • 选取结构体中类型字节数最大的最为对齐符。注意:是最大的类型字节数,例如:int a[10],并不是以40作为对齐符
  • 每次申请对齐符个字节大小的内存。
  • 当内存不够时才继续申请。
举例:
struct A
{
    int a[10];
    char b;
    double c;
}

//该结构体中最大的类型是double,所以对齐符为8
1、首先分配8个字节
2、int a[10]占40个字节
3、所以每两个数组元素申请8个字节
4、直到申请5次(40个字节)才将int a[10]全部分配完毕
5、再为b分配8个字节(此时已经48个字节了)
6、最后为c分配,此时为b申请的8个字节还剩7个字节,并不够用,还得再分配8个字节。
7、总共56个字节

2、类大小的计算

  • 首先,类的大小也最遵循结构体大小的对齐原则
  • 类的大小与普通数据成员有关,与成员函数和静态成员无关。即普通成员函数、静态成员函数、静态数据成员、静态常量数据成员均对类的大小无影响
  • 虚函数对类的大小有影响,是因为虚函数表指针带来的影响
  • 虚继承对类的大小有影响,是因为虚基表指针带来的影响
  • 空类的大小是一个特殊的情况,空类的大小为1

注意1:静态成员不计入类大小

class B
{
public:
	int a;
	char b;
	static int c;
};

//该类的大小为8,c不计入类的大小

注意2:空类大小为1

class B
{
public:
};
//空类,大小为1

注意3:派生类继承空类时,其大小为自身类大小,并不加上父类的1

class B
{
public:
};
class C : public B
{
public:
	int a;
};
//C的大小为4,并不是5

注意4:类中用空类,要将空类按一个字节算

class B
{
public:
};
class C
{
public:
	int a;
	B b;
};
//此时C的大小为8,C中的成员b按一个字节算,按照对其原则,C占8个字节

注意:5带虚函数的类的大小,要将虚函数指针算进去

class A
{
public:
	virtual int fun(){};
	int a;
};

class B : public A
{
public:
	int b;
};
//A大小为8,B大小为12

 

<think>嗯,用户想知道如何在代码中比较结构体大小。我需要先回顾结构体大小计算方式。结构体大小受内存对齐的影响,不同的编译器可能有不同的对齐规则,所以直接用sizeof运算符比较两个不同结构体大小应该没问题吧?比如sizeof(struct A)sizeof(struct B)直接比较。不过用户可能想比较的是结构体变量的大小,比如两个实例占用的内存谁大谁小。这时候直接用sizeof(s1)sizeof(s2)就可以了。要注意的是,结构体大小可能因为成员顺序不同而有差异,比如引用里的例子,s1的大小是12字节,而调整成员顺序后可能更小。不过用户的问题是比较结构体大小,可能有两种情况:比较同一结构体类型的不同实例,或者比较不同类型结构体大小。如果是同一类型,直接用sizeof就行;不同类型的话,比较它们的类型大小。不过需要确保结构体已经正确定义。另外,结构体指针的大小结构体实例的大小不同,指针通常是固定的,比如4或8字节,所以比较时要注意。需要提醒用户不要混淆指针结构体本身的大小。可能还需要给出示例代码,展示如何比较不同类型结构体大小,或者同一结构体的不同实例。还要注意内存对齐的影响,比如引用中的例子,结构体成员顺序不同导致大小不同,这时候比较的结果可能不同。所以总结步骤应该是:使用sizeof运算符,比较结构体类型或实例的大小,注意对齐的影响,并注意指针与实例的区别。然后给出代码示例,比如定义两个结构体,用sizeof比较它们的大小,输出结果。同时提醒用户注意事项,比如编译器差异、成员顺序的影响等。</think>在编程中比较结构体大小主要通过`sizeof`运算符实现,具体方法与注意事项如下: --- ### **1. 比较结构体类型大小** 直接通过`sizeof(结构体类型)`获取类型占用的内存字节数: ```c struct A { int x; char y; }; struct B { double z; short w; }; if (sizeof(struct A) > sizeof(struct B)) { printf("结构体A占更大内存"); } ``` --- ### **2. 比较结构体变量的大小** 对已实例化的结构体变量使用`sizeof`: ```c struct Stu1 s1; struct Stu2 s2; if (sizeof(s1) != sizeof(s2)) { printf("s1与s2的内存占用不同"); } ``` --- ### **3. 注意事项** - **内存对齐影响**:结构体大小成员顺序对齐规则影响。例如以下两个结构体: ```c struct Stu1 { char a; int b; char c; }; // 大小可能为12字节[^4] struct Stu2 { int b; char a, c; }; // 大小可能为8字节[^3] ``` 尽管成员相同,但因对齐规则不同,`sizeof(struct Stu1) > sizeof(struct Stu2)`[^4]。 - **指针与实例的区别**:结构体指针的大小固定(如4或8字节),与结构体实例无关[^2]: ```c struct Stu1 *ptr; printf("%zu", sizeof(ptr)); // 输出指针大小,而非结构体大小 ``` - **编译器差异**:不同编译器/平台的对齐规则可能导致结果不同。 --- ### **应用场景** - 动态内存分配时验证结构体大小 - 优化内存布局(通过调整成员顺序减少填充字节)[^3][^4] - 序列化/反序列化时确保数据边界正确 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值