您的位置:首页 > 财经 > 金融 > 内存分区学习

内存分区学习

2024/12/23 15:10:34 来源:https://blog.csdn.net/weixin_42130300/article/details/142110975  浏览:    关键词:内存分区学习

1.栈区

实现函数调用,编译器自动分配释放。

2.堆区

存放动态分配和释放的内容,new 和 delete

3.全局/静态存储区

存放全局变量和静态变量,程序结束时释放。

4.数据段(全局/静态存储区)

存放初始化了的全局变量和静态变量

此段数据在程序运行前分配,运行结束后释放。

5.BSS段

存放未初始化的全局变量和静态变量

6. 代码区(Text Segment)

存放程序的二进制代码和常量,代码段时只读的。

存放字符串字面量和const 变量的初始值值。

7. 对象内存布局

(1)简单非多态内存布局

class X {int     x;float   xx;public:X() {}~X() {}void printInt() {}void printFloat() {}
};
      |                        |          |------------------------| <------ X class object memory layout|        int X::x        ||------------------------|  stack segment|       float X::xx      |       |   |------------------------|       ||                        |      \|/|                        |    |                        |
------|------------------------|----------------|         X::X()         | |------------------------|       |   |        X::~X()         |       ||------------------------|      \|/|      X::printInt()     |  text segment|------------------------||     X::printFloat()    ||------------------------||                        |           

(2)同时具有虚函数和静态数据成员的内存布局

class X {int         x;float       xx;static int  count;public:X() {}virtual ~X() {}virtual void printAll() {}void printInt() {}void printFloat() {}static void printCount() {}
};
      |                        |          |------------------------| <------ X class object memory layout|        int X::x        |
stack |------------------------||   |       float X::xx      |                      |   |------------------------|      |-------|--------------------------||   |         X::_vptr       |------|       |       type_info X        |\|/  |------------------------|              |--------------------------||           o            |              |    address of X::~X()    ||           o            |              |--------------------------||           o            |              | address of X::printAll() ||                        |              |--------------------------||                        |
------|------------------------|------------|  static int X::count   |      /|\|------------------------|       ||           o            |  data segment           |           o            |       ||                        |      \|/
------|------------------------|------------|        X::X()          | |------------------------|       |   |        X::~X()         |       ||------------------------|       | |      X::printAll()     |      \|/ |------------------------|  text segment|      X::printInt()     ||------------------------||     X::printFloat()    ||------------------------|| static X::printCount() ||------------------------||                        |

(3)继承对象的内存布局

class X {int     x;string str;public:X() {}virtual ~X() {}virtual void printAll() {}
};class Y : public X {int     y;public:Y() {}~Y() {}void printAll() {}
};
      |                              |          |------------------------------| <------ Y class object memory layout|          int X::x            |
stack |------------------------------||   |              int string::len ||   |string X::str ----------------||   |            char* string::str |         \|/  |------------------------------|      |-------|--------------------------||           X::_vptr           |------|       |       type_info Y        ||------------------------------|              |--------------------------||          int Y::y            |              |    address of Y::~Y()    ||------------------------------|              |--------------------------||               o              |              | address of Y::printAll() ||               o              |              |--------------------------||               o              |              
------|------------------------------|--------|           X::X()             | |------------------------------|       |   |           X::~X()            |       ||------------------------------|       | |         X::printAll()        |      \|/ |------------------------------|  text segment|           Y::Y()             ||------------------------------||           Y::~Y()            ||------------------------------||         Y::printAll()        ||------------------------------||      string::string()        ||------------------------------||      string::~string()       ||------------------------------||      string::length()        ||------------------------------||               o              ||               o              ||               o              ||                              |

(4) 具有多重继承和虚拟功能的对象的内存布局

class X {
public:int     x;virtual ~X() {}virtual void printX() {}
};class Y {
public:int     y;virtual ~Y() {}virtual void printY() {}
};class Z : public X, public Y {
public:int     z;~Z() {}void printX() {}void printY() {}void printZ() {}
};
      |                              |          |------------------------------| <------ Z class object memory layout
stack |          int X::x            |         |   |------------------------------|                  |--------------------------|      |   |          X:: _vptr           |----------------->|       type_info Z        ||   |------------------------------|                  |--------------------------|\|/  |          int Y::y            |                  |    address of Z::~Z()    ||------------------------------|                  |--------------------------||          Y:: _vptr           |------|           |   address of Z::printX() ||------------------------------|      |           |--------------------------||          int Z::z            |      |           |--------GUARD_AREA--------|    |------------------------------|      |           |--------------------------||              o               |      |---------->|       type_info Z        ||              o               |                  |--------------------------||              o               |                  |    address of Z::~Z()    ||                              |                  |--------------------------|
------|------------------------------|---------         |   address of Z::printY() ||           X::~X()            |       |          |--------------------------|  |------------------------------|       |          |          X::printX()         |       |        |------------------------------|       |         |           Y::~Y()            |      \|/        |------------------------------|  text segment|          Y::printY()         |                |------------------------------|                |           Z::~Z()            |                |------------------------------|                |          Z::printX()         |                |------------------------------|                |          Z::printY()         |                |------------------------------|                |          Z::printZ()         |                |------------------------------|                |               o              |                |               o              |                |                              |  

原文链接:c++对象内存布局

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com