马上加入TC
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
【内存教程】怪物属性 怪物全部属性的查找。
打开VS2008,新建一个VC++项目,
之后定义一个纯虚类(怪物类)
在类中,定义成员属性(类属性)
在TC论坛,多数成员不懂C++语言,所以用伪代码来讲解,更加容易讲明白。
内存对齐规则:
1. 结构体的整体大小,必须是最大对齐数_的整数倍。不足部分_用空字节填充。
(最大对齐数,含嵌套结构体的对齐数)
2. 结构体成员,必须按最大对齐数来对齐。(2个或多个成员,可以组合到_最大对齐数) 例如:
struct S5
{
double d;
char c0;
char c1;
int i;
short c2;
};
printf("%d\n", sizeof(struct S5)); //16
.
成员1是double类型,占8字节
成员2是char类型,占1字节
成员3是char类型,占1字节
成员4是int类型,占4字节
成员5是short类型,占2字节
成员1最大对齐数为8。成员2--5字节组合,跟8字节对齐。所以这个结构占16字节。
//申明一个结构体
struct book
{
char title[MAXTITL];//一个字符串表示的titile 题目;字符数组就是这样声明的,用分号结束;
char author[MAXAUTL];//一个字符串表示的author作者 ;
float value;//一个浮点型表示的value价格;
};//注意分号不能少,这也相当于一条语句;
例如 植物大战僵尸的boss结构。其实是类,纯虚类.
double 座标x; //8
double 座标y; //8
char name[4]; //4
int id; //4
int 血量; //4
int 蓝量; //4
short 血量状态; //2
//1正常 2伤血 3残血 4死亡 5灰烬
short 行动状态; //2
//1行走 2攻击 3冰冻 4魅惑
short 怪物大小; //2
//1正常 2缩小
.
怪物有9个属性。最大对齐数为8,
8字节 * 5= 40字节
纯虚类不占内存空间,把类实例化之后,每个怪物对象占40字节。
10进制40,转换十六进制是0x28
=======================================================
C/C++申请和释放内存
new 和 delete 是 C++ 用于管理_堆内存的两个运算符,对应于C语言中的 malloc 和 free,但是 malloc 和 free 是函数,而new 和 delete 是运算符。
除此之外,new 在申请内存的同时,还会调用对象的构造函数,而 malloc 只会申请内存;同样,delete 在释放内存之前,会调用对象的析构函数,而 free 只会释放内存。
###C++
new运算符申请内存:
将调用相应的 operator new(size_t) 函数动态分配内存,在分配到的动态内存块上 初始化 相应类型的对象(构造函数)并返回其首地址。如果调用构造函数初始化对象时抛出异常,则自动调用 operator delete(void*, void*) 函数释放已经分配到的内存。
delete运算符释放内存:
调用相应类型的析构函数,处理类内部可能涉及的资源释放,调用相应的 operator delete(void *) 函数。
=======================================================
在矩形区域中,(x1, y1, x2, y2)
限定怪物数量 上限为39只。那么需要占用内存空间为:
40字节/只 * 39只 = 1560字节
从堆中分配:也称为动态内存分配。申请内存空间1560字节,返回 分配到内存空间的首地址。
之后把纯虚类(怪物类),实体化到申请的内存空间。实体化一次,就是一个怪物对象。
.
C++中,用new运算符,申请内存更为简便。
type *p_var = new type [size];
//分配了size个type大小的连续内存块。
假设返回的首地址是0x1399dd,
那么第一个怪物对象,所占的内存字节为:
(0x1399dd+0字节)——(0x1399dd+39字节)
.
怪物名称,地址是:0x1399dd+0x0
怪物序号,地址是:0x1399dd+0x4
怪物血量,地址是:0x1399dd+0x8
怪物蓝量,地址是:0x1399dd+0x0c
怪物座标x,地址是:0x1399dd+0x10
怪物座标y,地址是:0x1399dd+0x14
…………
…………
内存方面比较难,欢迎大佬教育。
|