您的位置:首页 > 编程语言 > C语言/C++

C++中一个class类对象占用多少内字节(7个例子,很清楚)

2017-10-13 16:13 274 查看
一个空的class在内存中多少字节?如果加入一个成员函数后是多大?这个成员函数存储在内存中什么部分?

一个Class对象需要占用多大的内存空间。最权威的结论是:
*非静态成员变量总合。
*加上编译器为了CPU计算,作出的数据对齐处理。
*加上为了支持虚函数,产生的额外负担。

介绍完了理论知识后,再看看再找一个例子看看(注:一下所有结果都是在VC6.0 开发环境中得出的结论)

一、空类的Size

1 class Car
2 {
3 };
4
5 void main()
6 {
7     int size = 0;
8     Car objCar;
9     size = sizeof(objCar);
10     printf("%s %d /r", "Class Car Size:", size);
11 }


输出结果:Class Car Size:1

这是为何呢?我想对于这个问题,不仅是刚入行不久的开发新手,就算有过几年以上C++开发经验的开发人员也未必能说清楚这个。
编译器在执行Car objCar;这行代码后需要,作出一个Class Car的Object。并且这个Object的地址还是独一无二的,于是编译器就会给空类创建一个隐含的一个字节的空间。

二、只有成员变量的Size

1 class Car
2 {
3 private:
4     int nLength;
5     int nWidth;
6 };
7
8 void main()
9 {
10     int size = 0;
11     Car objCar;
12     size = sizeof(objCar);
13     printf("%s %d /r", "Class Car Size:", size);
14 }


输出结果:Class Car Size:8

这个结果很多开发人员都清楚。在32位系统中,整型变量占4个字节。这里Class Car中含有两个整型类型的成员变量,所以Class Size是8。

三、有静态成员变量[b]的Size[/b]

1 class Car
2 {
3 private:
4     int nLength;
5     int nWidth;
6     static int sHigh;
7 };
8
9 void main()
10 {
11     int size = 0;
12     Car objCar;
13     size = sizeof(objCar);
14     printf("%s %d /r", "Class Car Size:", size);
15 }


输出结果:Class Car Size:8

我们这次在Class Car中添加了一个静态成员变量,但是Class Size仍然是8个字节。这正好符合了,结论中的第一条:非静态成员变量总合。

四、有字符型变量(char)[b]的Size[/b]

1 class Car
2 {
3 private:
4     char chLogo
5     int nLength;
6     int nWidth;
7     static int sHigh;
8 };
9
10 void main()
11 {
12     int size = 0;
13     Car objCar;
14     size = sizeof(objCar);
15     printf("%s %d /r", "Class Car Size:", size);
16 }


输出结果:Class Car Size:12

在类中又插入了一个字符型变量,结果Class Size变成了12。这个就是编译器额外添加3个字符变量,做数据对齐处理,为了是提高CPU的计算速度。编译器额外添加的东西我们是无法看见的。这也符合了结论中的第二条:加上编译器为了CPU计算,作出的数据对齐处理。
既然,我们这样定义类成员数据编译器会额外的增加空。那么,我们何不在定义类的时候就考虑到数据对齐的问题,可以多定义出3个字符类型变量作为预留变量,既能满足数据对齐的要求,也给自己的程序添加了一些可扩展的空间。

五、只有成员函数的Size

1 class Car
2 {
3 public:
4     Car(){};
5     ~Car(){};
6 public:
7     void Fun(){};
8 };
9
10 void main()
11 {
12     int size = 0;
13     Car objCar;
14     size = sizeof(objCar);
15     printf("%s %d /r", "Class Car Size:", size);
16 }


输出结果:Class Car Size:1

噢,这是怎么回事儿呢?再做一个实验看看。

六、有成员函数和成员变量的Size

1 class Car
2 {
3 public:
4     Car(){};
5     ~Car(){};
6 public:
7     void Fun(){};
8 private:
9     int nLength;
10     int nWidth;
11 };
12
13 void main()
14 {
15     int size = 0;
16     Car objCar;
17     size = sizeof(objCar);
18     printf("%s %d /r", "Class Car Size:", size);
19 }


输出结果:Class Car Size:8

这次应该很清楚的了。函数是不占用类空间的。第一个例子中的Size为1个字节,正是编译器为类创建一个隐含的一个字节的空间

七、有虚函数(virtual)的Size

1 class Car
2 {
3 public:
4     Car(){};
5     virtual ~Car(){};
6 public:
7     void Fun(){};
8 };
9
10 void main()
11 {
12     int size = 0;
13     Car objCar;
14     size = sizeof(objCar);
15     printf("%s %d /r", "Class Car Size:", size);
16 }


输出结果:Class Car Size:4

这次,让析构函数为虚函数,看到了Class Size为4。这正是指向Virtual Table的指针vptr的Size。这正好符合了,结论中的第三条:加上为了支持虚函数,产生的额外负担。
http://www.cnblogs.com/findumars/p/7270628.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: