Skip to content

Latest commit

 

History

History
145 lines (111 loc) · 2.83 KB

01.类对象所占用的空间.md

File metadata and controls

145 lines (111 loc) · 2.83 KB

类对象所占用的空间

探究空类

#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;

class A
{
public:

};

int main()
{
	A a;
	int ilen = sizeof(a);
	printf("ilen = %d\n", ilen); // 1
}

虽然a是一个空类,但是它的地址单元保存1字节的内容。即使是空类的对象,但是因为在内存中是有起始地址的,既然这个地址属于这个对象,该对象则必然最少能存的下一个字节。只要有内存地址,那就表示至少能存下一个字节

在这里,指的是产生一个类A的对象,这个对象所占用的内存大小为1字节

探究包含非静态成员函数的类

#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;

class A
{
public:
	void func() {}
	void func1() {}
	void func2() {}
};

int main()
{
	A a;
	int ilen = sizeof(a);
	printf("ilen = %d\n", ilen); // 1
}

结果依旧为1字节,得到结论:类中的成员函数是不占用类对象内存空间的

尝试向其中加入成员变量

#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;

class A
{
public:
	void func() {}
	void func1() {}
	void func2() {}
public:
	char ab;
};

int main()
{
	A a;
	a.ab = 'c';
	int ilen = sizeof(a);
	printf("ilen = %d\n", ilen); // 1
}

得到的值仍然是1,但这次1字节的空间是char ab的,因为char类型恰好就是一字节。

我们可以观察内存得到这一结论,记得要为a的成员变量ab赋值a.ab = 'c';

image-20211125115433366

观察得到,第一个字节的内容为c,说明这一个字节为成员变量的字节

我们把成员变量变成int类型

#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;

class A
{
public:
	void func() {}
	void func1() {}
	void func2() {}
public:
	int ab;
};

int main()
{
	A a;
	a.ab = 'c';
	int ilen = sizeof(a);
	printf("ilen = %d\n", ilen); // 4
}

image-20211125115756308

观察内存得到是63,且占据了4个字节,恰好对应。因为c的ASCII正好为63

a.ab = 15;
0x001EF8C4  0f 00 00 00 cc cc cc cc ec f8 1e 00 d3 2f b8 00 01 00 00 00 b0  ....??????..?/?.....?
0x001EF8D9  5b 6a 00 b8 6e 6a 00 01 00 00 00 b0 5b 6a 00 b8 6e 6a 00 48 f9  [j.?nj.....?[j.?nj.H?

正好对应了16进制

1 2 3 4 5 6 7 8 9 A B C D E F (10对应16)

成员变量是包含在每个对象中的,占字节的

成员函数虽然也写在类定义中,但是成员函数不占类对象的字节空间。成员函数跟着类走,跟类对象无关。

浮点数的存储?