转载自:http://c.biancheng.NET/cpp/biancheng/view/2995.html点击打开链接

当对象被创建时,编译器会为每个对象分配内存空间,包括成员变量和成员函数。

直观的认识是,如果定义了10个对象,那么就要分别为这10个对象的变量和函数分配内存空间,如下图所示:

虽然每个对象的成员变量不同,但是成员函数的代码却是一样的,上面的内存模型保存了10份相同的代码片段,浪费了很多空间。

事实上,编译器会将成员变量和成员函数分开存储:分别为每个对象的成员变量分配内存,但是所有对象都共享同一段函数代码。如下图所示:

请看下面的一个例子:

  1. #include<iostream>
  2. using namespace std;
  3. class Demo{
  4. public:
  5. int a;
  6. float b;
  7. void display();
  8. };
  9. void Demo::display(){
  10. cout<<"a="<<a<<", b="<<b<<endl;
  11. }
  12. int main(){
  13. Demo obj;
  14. obj.a = 1;
  15. obj.b = 2;
  16. obj.display();
  17. return 0;
  18. }

obj 既是对象,也是 main 函数中的局部变量,类型为 Demo,它和通过 int、char 等定义出来的普通变量一样,都在栈区分配内存。

假设 obj 的起始地址为 0X1000,那么它的内存分布如下图所示:

a、b 都为 int 类型,占用4个字节内存,并且按照声明时的顺序依次排列,所以 obj 对象总共占用8个字节的内存。读者可以使用sizeof(obj)语句亲测。

对象的大小只受成员变量的影响,和成员函数没有关系。成员函数在代码区分配内存,而不是在栈区。

最新文章

  1. gradle和maven有什么用?分别有什么区别?
  2. JS-节点属性(常用!)
  3. [转]asp.net解决高并发的方案.
  4. HTTP协议——学习资料小结
  5. BZOJ 1013 球形空间产生器
  6. Perl ping
  7. UIControl IOS控件编程 及UITextField的讲解
  8. spring 注解配置
  9. JavaScript(第七天)【对象和数组】
  10. Android 超高仿微信图片选择器 图片该这么加载
  11. [Swift]LeetCode923.三数之和的多种可能 | 3Sum With Multiplicity
  12. Mybatis Generator的model生成中文注释,支持oracle和mysql(通过实现CommentGenerator接口的方法来实现)
  13. html5 实时监听输入框值变化的完美方案:oninput &amp; onpropertychange
  14. 关闭2010中 word每次都提示:所做更改会影响共用模板 Normal.dotm
  15. 51nod 四级题 汇总
  16. CSS opacity的兼容写法
  17. Runtime.getRuntime().addShutdownHook(Thread thread) 程序关闭时钩子,优雅退出程序
  18. 使用CodePush实时更新 React Native 和 Cordova 应用
  19. fuz 2159 WuYou
  20. centos中如何查看tomcat的版本

热门文章

  1. python 中动态类的创建
  2. 【51nod 1355】 斐波那契数的最小公倍数
  3. 基于neighborhood models(item-based) 的个性化推荐系统
  4. GitHub:如何构建一个股票市场知识图谱?(附代码&amp;链接)
  5. css 阴影设置box-shadow
  6. .Net Email操作类
  7. mysql三表联合查询,结果集合并
  8. Create STKNetDiskC Instance Error
  9. js节点
  10. CSS3 进阶