C++中一个class类对象占用多少内字节(7个例子,很清楚)
2017-10-13 16:13
274 查看
一个空的class在内存中多少字节?如果加入一个成员函数后是多大?这个成员函数存储在内存中什么部分?
一个Class对象需要占用多大的内存空间。最权威的结论是:
*非静态成员变量总合。
*加上编译器为了CPU计算,作出的数据对齐处理。
*加上为了支持虚函数,产生的额外负担。
介绍完了理论知识后,再看看再找一个例子看看(注:一下所有结果都是在VC6.0 开发环境中得出的结论)
一、空类的Size
这是为何呢?我想对于这个问题,不仅是刚入行不久的开发新手,就算有过几年以上C++开发经验的开发人员也未必能说清楚这个。
编译器在执行Car objCar;这行代码后需要,作出一个Class Car的Object。并且这个Object的地址还是独一无二的,于是编译器就会给空类创建一个隐含的一个字节的空间。
二、只有成员变量的Size
这个结果很多开发人员都清楚。在32位系统中,整型变量占4个字节。这里Class Car中含有两个整型类型的成员变量,所以Class Size是8。
三、有静态成员变量[b]的Size[/b]
我们这次在Class Car中添加了一个静态成员变量,但是Class Size仍然是8个字节。这正好符合了,结论中的第一条:非静态成员变量总合。
四、有字符型变量(char)[b]的Size[/b]
在类中又插入了一个字符型变量,结果Class Size变成了12。这个就是编译器额外添加3个字符变量,做数据对齐处理,为了是提高CPU的计算速度。编译器额外添加的东西我们是无法看见的。这也符合了结论中的第二条:加上编译器为了CPU计算,作出的数据对齐处理。
既然,我们这样定义类成员数据编译器会额外的增加空。那么,我们何不在定义类的时候就考虑到数据对齐的问题,可以多定义出3个字符类型变量作为预留变量,既能满足数据对齐的要求,也给自己的程序添加了一些可扩展的空间。
五、只有成员函数的Size
噢,这是怎么回事儿呢?再做一个实验看看。
六、有成员函数和成员变量的Size
这次应该很清楚的了。函数是不占用类空间的。第一个例子中的Size为1个字节,正是编译器为类创建一个隐含的一个字节的空间
七、有虚函数(virtual)的Size
这次,让析构函数为虚函数,看到了Class Size为4。这正是指向Virtual Table的指针vptr的Size。这正好符合了,结论中的第三条:加上为了支持虚函数,产生的额外负担。
http://www.cnblogs.com/findumars/p/7270628.html
一个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
相关文章推荐
- C++中一个class类对象占用多少内字节(7个例子,很清楚)
- C++中一个class类对象占用多少内字节
- C++中一个class类对象占用多少内字节
- C++中一个class类对象占用多少内字节
- C++中一个class类对象占用多少内字节
- C++中一个class类对象占用多少内字节
- C++中一个class类对象占用多少内字节
- 转载: C++中一个class类对象占用多少内字节
- C++中一个class类对象占用多少内字节
- 一个对象占用多少字节?
- C/C++—— C++中一个空对象为什么还要占用一个字节空间
- [转载]一个对象占用多少字节?
- JAVA基础—一个对象占用多少字节
- 一个对象占用多少字节?
- 一个java对象占多少个字节?
- JAVA内存使用--如何计算一个Java对象占用的字节数
- 【OC底层】一个OC对象占用多少内存?
- UTF-8 编码里,一个汉字占用多少个字节 -转
- C++中提供了多种基本的数据类型。实际上,这些远不能满足我们的需求,如复数(第10章的例子大多是处理虚数的),再如分数。本任务将设计一个简单的分数类,完成对分数的几个运算。一则巩固基于对象编程的方法,
- 一个jstl标签综合运用的例子(包括下拉列表事件处理等等),直观了解一个浏览器页面上有多少对象)