版权声明:转载请注明作者和出处。 https://blog.csdn.net/LQMIKU/article/details/79070135
从内存四区的角度来理解C++中的类
- 结论
- 试验
阅读之前注意:
本文阅读建议用时:14min
本文阅读结构如下表:
项目 | 下属项目 | 测试用例数量 |
---|---|---|
结论 | 无 | 0 |
试验 | 无 | 1 |
结论
先给出内存四区的概念:堆区、栈区、全局区、代码区。详情可自行搜索,此处不作赘述。
C++类中对象的成员变量和成员函数是分开存储的。
普通成员变量:存储于对象(栈区或堆区)中,与struct变量有相同的内存布局和字节对齐方式(会补齐);
静态成员变量:存储于全局区。
成员函数:存储于代码区。
而当很多的对象共用同一块代码时,是通过this指针来区分不同的对象1
无论语言怎么变,它们在内存上的基础都是一样的。
试验
我们通过以下程序来测试。
参考以下代码:
#include "iostream"
using namespace std;
class C1
{
public:
int i; //4
int j; //4
int k; //4
protected:
private:
}; //12
class C2
{
public:
int i; //4
int j; //4
int k; //4
static int m; //4
public:
int getK() const { return k; } //4
void setK(int val) { k = val; } //4
protected:
private:
}; //24 16 ?
struct S1
{
int i;
int j;
int k;
}; //12
struct S2
{
int i;
int j;
int k;
static int m;
}; //16?
int main()
{
printf("c1:%d \n", sizeof(C1));
printf("c2:%d \n", sizeof(C2));
printf("s1:%d \n", sizeof(S1));
printf("s2:%d \n", sizeof(S2));
system("pause");
}
试着运行以上程序,我们就能体会到成员变量、成员函数在内存中的分布了2