看一下简单的例子,一个类声明中包含了一个结构体的声明,在没有定义这个结构体变量的情况下:
#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的内存大小。