c++内存管理2:小的内存管理
1、降低malloc()的次数
虽然malloc()调用并不慢,但如果减少调用malloc()的次数总是好的,因此可以一次使用malloc申请一大块的内存,然后再切割
2、降低cookie的用料
一次使用malloc就要有一组cookie,如果有1000的对象要生成,那么使用一次malloc就会只有一组cookie,如果一次全部申请下来,那么这1000个仅有一组cookie
也即速度和空间
实现的第一个版本
第一个版本由于需要指针指向下一个快的空间,因此并没有减少占用的内存
第二个版本
定义:union类似struct的联合体,但联合的所有成员引用的内存中的相同位置,以最大的成员的内存作为union的内存大小。
注意:1、同一块内存段可以存放多种类型,但同一时刻仅能存放一种数据类型,即申请的一块内存中的某一部分内存同一时刻只能有一个成员起作用
2、共同体起作用的是最后一个存放的成员,存入新的一个后,原先的那个就会被覆盖。
以下面代码为例
#include <iostream>
using namespace std;
union Node{
struct{
int a;
char b;
}t;
int c;
}Obj;
struct{
int a;
char b;
}ct;
int main(int argc, char *argv[])
{
cout<<"sizeof(Obj) = "<<sizeof(Obj)<<endl;
cout<<"sizeof(ct) = "<<sizeof(ct)<<endl; //和上面的相等
Obj.t.a = 10;
Obj.t.b = 97;
Obj.c = 20;
cout<<"Obj.t.a = "<<Obj.t.a<<endl;
cout<<"Obj.t.b = "<<int(Obj.t.b)<<endl;
cout<<"Obj.c = "<<Obj.c<<endl;
return 0;
}
1、可以看到obj和ct所占内存是一样的,尽管obj里面相比ct还多个int类型的变量,这是因为是用最大的一块作为union的大小。
2、对t.a t.b赋值后,此时t.a=10,t.b=97,这是独立的一块,后来对c赋值,由于c与t占同样的内存,那么c就会占用一个int类型的空间大小,刚好覆盖t.a的数据,由于t.b没有被覆盖,因此t.a会显示为c的值,t.b的值还是原先那个
总结: union 和 struct的区别
(1)union和struct都是由多个不同的数据成员组成,但是union所有成员共享一段内存地址,只存放最后一次赋值的成员值,而struct可以存放所以有成员的值。
(2)union的大小是所有成员中所占内存最大的成员的大小,struct是所有成员的大小的“和”。
可以看到间隔少了8个字节
第三个版本
如果每个类都要写一个new的方法,那么太过繁琐,因此需要将重复动作抽取出来放到一个class里面
抽取出来形成一个方法
在调用的时候只需要加上下面黄色标注的内容,无需再做重复的操作
再次简化 设计出一个malloc宏