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++对象内存布局