一个空的class在内存中多少字节?如果加入一个成员函数后是多大?这个成员函数存储在内存中什么部分?

  一个Class对象需要占用多大的内存空间。最权威的结论是:

  1. 非静态成员变量总合。
  2. 加上编译器为了CPU计算,作出的数据对齐处理。 
  3. 加上为了支持虚函数,产生的额外负担。

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

 1、空类的Size

  编译器在执行Car objCar;这行代码后需要,作出一个Class Car的Object。并且这个Object的地址还是独一无二的,于是编译器就会给空类创建一个隐含的一个字节的空间。

class Car
{
}; void main()
{
int size = ;
Car objCar;
size = sizeof(objCar);
printf("%s %d /r", "Class Car Size:", size);
} 输出结果:Class Car Size:

 2、只有成员变量的Size

(1)在32位系统中,整型变量占4个字节。这里Class Car中含有两个整型类型的成员变量,所以Class Size是8。

class Car
{
private:
int nLength;
int nWidth;
}; void main()
{
int size = ;
Car objCar;
size = sizeof(objCar);
printf("%s %d /r", "Class Car Size:", size);
} 输出结果:Class Car Size:

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

class Car
{
private:
int nLength;
int nWidth;
static int sHigh;
}; void main()
{
int size = ;
Car objCar;
size = sizeof(objCar);
printf("%s %d /r", "Class Car Size:", size);
}
输出结果:Class Car Size:

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

class Car
{
private:
char chLogo
int nLength;
int nWidth;
static int sHigh;
}; void main()
{
int size = ;
Car objCar;
size = sizeof(objCar);
printf("%s %d /r", "Class Car Size:", size);
}
输出结果:Class Car Size:

 3、只有成员函数的Size

class Car
{
public:
Car(){};
~Car(){};
public:
void Fun(){};
}; void main()
{
int size = ;
Car objCar;
size = sizeof(objCar);
printf("%s %d /r", "Class Car Size:", size);
}
输出结果:Class Car Size:

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

class Car
{
public:
Car(){};
~Car(){};
public:
void Fun(){};
private:
int nLength;
int nWidth;
}; void main()
{
int size = ;
Car objCar;
size = sizeof(objCar);
printf("%s %d /r", "Class Car Size:", size);
}
输出结果:Class Car Size:

  这次,让析构函数为虚函数,看到了Class Size为4。这正是指向Virtual Table的指针vptr的Size。这正好符合了,结论中的第三条:加上为了支持虚函数,产生的额外负担。

class Car
{
public:
Car(){};
virtual ~Car(){};
public:
void Fun(){};
}; void main()
{
int size = ;
Car objCar;
size = sizeof(objCar);
printf("%s %d /r", "Class Car Size:", size);
}
输出结果:Class Car Size:

最新文章

  1. ASP.NET MVC4框架揭秘 源代码下载
  2. 关于ASP.NET或VS2005 搭建三层架构的理解
  3. ASP.NET的路由
  4. 【Winform】 无法将类型为“System.Windows.Forms.SplitContainer”的对象强制转换为类型“System.ComponentModel.ISupportInitialize”。
  5. Upgrading to EF6
  6. novnc ignoring socket not reay
  7. 安装Office时出现windows installer服务不能更新一个或多个受保护的windows文件错误的解决方法
  8. Problem with generating association inside dbml file for LINQ to SQL
  9. cocos2d-x-3.1 事件分发机制 (coco2d-x 学习笔记七)
  10. SQL Server 2008 R2 性能计数器详细列表(三)
  11. iOS 获取公历、农历日期的年月日
  12. SpringMvc多视图配置(jsp、velocity、freemarker) 在src目录views.properties配置
  13. year:2017 month:7 day:20
  14. Factorials
  15. Redis的数据结构之sorted-set
  16. java中实现对list的模糊查询
  17. 端口与进程-----Window cmd命令
  18. python学习第16天。
  19. POJ1860(Currency Exchange)
  20. git--(3)分支 合并

热门文章

  1. Python中request的post请求报requests.exceptions.SSLError:
  2. [LeetCode] 88. Merge Sorted Array 合并有序数组
  3. [LeetCode] 224. Basic Calculator 基本计算器
  4. 错误:net::ERR_BLOCKED_BY_CLIENT
  5. Kubernetes 服务质量 Qos 解析 - Pod 资源 requests 和 limits 如何配置?
  6. Python Tkinter 窗口创建与布局
  7. Apache Kafka教程
  8. 关于MySQL的内连接,外连接的总结
  9. pom.xml文件导入了坐标,也没有报错,为什么还是没有相关的jar包的?
  10. 在laravel框架中使用模板继承来进行更方便的布局