C++对象的内存模型
2016-04-01 09:25
417 查看
转载自:http://c.biancheng.net/cpp/biancheng/view/2995.html点击打开链接
当对象被创建时,编译器会为每个对象分配内存空间,包括成员变量和成员函数。
直观的认识是,如果定义了10个对象,那么就要分别为这10个对象的变量和函数分配内存空间,如下图所示:
虽然每个对象的成员变量不同,但是成员函数的代码却是一样的,上面的内存模型保存了10份相同的代码片段,浪费了很多空间。
事实上,编译器会将成员变量和成员函数分开存储:分别为每个对象的成员变量分配内存,但是所有对象都共享同一段函数代码。如下图所示:
请看下面的一个例子:
obj 既是对象,也是 main 函数中的局部变量,类型为 Demo,它和通过 int、char 等定义出来的普通变量一样,都在栈区分配内存。
假设 obj 的起始地址为 0X1000,那么它的内存分布如下图所示:
a、b 都为 int 类型,占用4个字节内存,并且按照声明时的顺序依次排列,所以 obj 对象总共占用8个字节的内存。读者可以使用
对象的大小只受成员变量的影响,和成员函数没有关系。成员函数在代码区分配内存,而不是在栈区。
当对象被创建时,编译器会为每个对象分配内存空间,包括成员变量和成员函数。
直观的认识是,如果定义了10个对象,那么就要分别为这10个对象的变量和函数分配内存空间,如下图所示:
虽然每个对象的成员变量不同,但是成员函数的代码却是一样的,上面的内存模型保存了10份相同的代码片段,浪费了很多空间。
事实上,编译器会将成员变量和成员函数分开存储:分别为每个对象的成员变量分配内存,但是所有对象都共享同一段函数代码。如下图所示:
请看下面的一个例子:
#include<iostream> using namespace std; class Demo{ public: int a; float b; void display(); }; void Demo::display(){ cout<<"a="<<a<<", b="<<b<<endl; } int main(){ Demo obj; obj.a = 1; obj.b = 2; obj.display(); return 0; }
obj 既是对象,也是 main 函数中的局部变量,类型为 Demo,它和通过 int、char 等定义出来的普通变量一样,都在栈区分配内存。
假设 obj 的起始地址为 0X1000,那么它的内存分布如下图所示:
a、b 都为 int 类型,占用4个字节内存,并且按照声明时的顺序依次排列,所以 obj 对象总共占用8个字节的内存。读者可以使用
sizeof(obj)语句亲测。
对象的大小只受成员变量的影响,和成员函数没有关系。成员函数在代码区分配内存,而不是在栈区。
相关文章推荐
- C++(union), C#(伪union)实现 Java的Float.intBitsToFloat()方法
- 【poj 3258】River Hopscotch 题意&题解&代码(C++)
- OC语言--NSFileManager& NSFileHandle
- C语言(概念术语装逼犯)
- 链表的实现(C++)
- 【poj 3273】Monthly Expense 题意&题解&代码(C++)
- CSP考试 2014年12月第1题 门禁系统 C语言实现
- C++ 调试帮助
- C语言学习003:Hello 指针
- CSP考试 2014年03月第1题 相反数 C语言实现
- CSP考试 2013年12月第1题 出现次数最多的数 C语言实现
- 环形缓冲区的C语言实现
- C++引用与指针的区别
- C++实验2-2-分段函数求值
- C++作业2
- 用指向数组的指针作函数参数.etc
- C++ string and vector(一)
- C++ string and vector(二)
- Learning C++ 1.数据类型
- Learning C++ 1.数据类型