C++对象内存模型

329 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

 经常用C++,虽然很多文字描述的很清楚,对象的内存布局:比如代码区,用户内存区,静态数据区之类的,然则,还是不够形象,清晰,理解上难免有误,下面通过一段最简单的C++对象代码来解释C++的对象模型。

例子如下:

  1 #include <string>
  2 #include <iostream>
  3 using namespace std;
  4 class Student{
  5     private:
  6         static int stuNum;
  7         string name;
  8         int age;
  9     
 10     public:
 11         Student(string name, int age);
 12         ~Student();
 13         string getName();
 14         int getAge();
 15 
 16 };

root@maokx:~/learn/objectModel# vim student.cpp

  1 #include "student.h"
  2 
  3 Student::Student(string name, int age)
  4 {  
  5   cout<<"Student"<<endl;
  6    this->name = name;
  7    this->age = age;
  8 }
  9 
 10 Student::~Student()
 11 { 
 12   cout<<"~Student"<<endl;
 13 }
 14 
 15 string Student::getName()
 16 {  
 17    cout<<"name is "<< name <<endl;
 18    return this->name;
 19 }
 20 
 21 int Student::getAge()
 22 {  
 23    cout<<"age is "<< age <<endl;
 24    return this->age;
 25 }
 26 
 27   1 #include "student.h"
  2 
  3 int main()
  4 {
  5  string name1 = "xiaoli";
  6  Student stu1(name1, 19);
  7  stu1.getName();
  8  
  9  string name2 = "xiaowang";
 10  Student stu2(name2, 20);
 11  stu2.getName();
 12 }
root@mkx:~/learn/objectModel# g++ main.cpp student.cpp student.h -o mainObject
root@mkx:~/learn/objectModel# ./mainObject 
Student
name is xiaoli
Student
name is xiaowang
~Student
~Student
root@mkx:~/learn/objectModel# 

上面这些代码,可以说是最简单的C++对象代码了,其内存模型如下:

image.png

通过对象内存模型可知:

其实,区分对象的是成员变量,每一个对象都有自己的成员变量;静态变量位位于全局静态数据区,代码呢,是共享的,位于代码区。

这与我以往感觉代码应该每一个对象一份的感觉是不同的,事实不是这样的。

掌握了对象内存模型,就能很好的处理很多问题了,比如线程安全之类的。

欢迎大家批评指正