包含结构体的类的大小

        看一下简单的例子,一个类声明中包含了一个结构体的声明,在没有定义这个结构体变量的情况下:

#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>

class CTest
{
public:
	CTest(){}
	~CTest() {}

	struct  internal
	{
		internal(){};
		int a;
		int *ptr;
	};
	
private:	

	int *p;
	int value;
};

int main()
{
	printf("sizeof CTest is: %lu\n", sizeof(CTest));
	
	return 0;
}

这个输出结果是什么呢?是类的成员 int *p, int value 加上 结构体的成员 int a, int *ptr 的大小和吗? 

实际情况是只计算了类的成员变量的大小(8字节对齐) 。我们知道不管是class 还是 structure 它们都是有大小的,如:

#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>

class CTest
{
public:
	CTest(){}
	~CTest() {}

	struct  internal
	{
		internal(){};
		int a;
		int *ptr;
	};
	
private:	

	int *p;
	int value;
};

int main()
{
	printf("sizeof CTest is: %lu, sizeof(struct internal) is %lu \n", sizeof(CTest), sizeof(CTest::internal));
	
	return 0;
}


但当我们是计算一个 class 或 structure 时,只计算它的成员变量的大小,这里的 class 只是声明了一个结构体,但并没有定义变量,声明并不占用这个 class 的内存大小,只有当定义了变量才算,如:

#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>

class CTest
{
public:
	CTest(){}
	~CTest() {}

	struct  internal
	{
		internal(){};
		int a;
		int *ptr;
	};
	
private:	
	internal mInternal;
	int *p;
	int value;
};

int main()
{
	printf("sizeof CTest is: %lu, sizeof(struct internal) is %lu \n", sizeof(CTest), sizeof(CTest::internal));
	
	return 0;
}

 

 总结:class 里声明了结构体并不占用class本身的内存大小,定义了该结构体成员变量才占用class的内存大小。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值