typedef
typedef struct Role
{
int Hp;
int Mp;
} *Prole, *xRole, *yRole;
这里给Role*重新命名了,Prole、xRole、yrole等都是它的名字
特别注意*:这一段没有汇编代码,只有源码,说明这段代码编译后,在内存中不存在,这段代码的作用是告诉编译器,有Role这个类型,并且这个Role类型的结构是这样的
注:A代表HP的内存,B代表MP的内存,1小格代表1字节
A | A | A | A |
B | B | B | B |
如表,HP占了四个字节,MP占了四个字节
结构体指针的语法
->
int main()
{
Role user;
pRole pUser=&user;
pUser->Hp=1000;
puser->Mp=2000;
user.Hp=1000;
user.Mp=2000;
}
这里运用了结构体指针puser进行赋值
查看汇编代码
1 Role user;
2 pRole pUser = &user;
3 00C01E9B lea eax,[user]
4 00C01E9E mov dword ptr [pUser],eax
5 pUser->Hp = 1000;
6 00C01EA1 mov ecx,dword ptr [pUser]
7 00C01EA4 mov dword ptr [ecx],3E8h
8 pUser->Mp = 2000;
9 00C01EAA mov edx,dword ptr [pUser]
10 00C01EAD mov dword ptr [edx+4],7D0h
11 user.Hp = 1000;
12 00C01EB4 mov dword ptr [user],3E8h
user.Mp = 2000;
13 00C01EBB mov dword ptr [ebp-8],7D0h
分析:
第三行:eax=&user 第9行:edx=&pUser
第四行:&puser=eax 第10行:&edx+4=2000
第6行:ecx=&pUser
第7行:&ecx=1000
可以看出,结构体指针的运算就是按照偏移量来计算的,首先给HP赋值时,偏移0,给MP赋值时,偏移了4.,4就是HP的内存大小
内存对齐
struct Role
{
short ID;
int Hp;
int Mp;
}
std::cout<<sizeof(Role);
输出结果为12,按道理来说,结果应该是2+4+4=10才对,为什么是12呢
ID | ID | ||
HP | HP | HP | HP |
MP | MP | MP | MP |
如该内存模拟图,ID占了两个字节,HP占了四字节,本来HP应该紧接着排在ID后面,但是由于内存对齐,只能换行,所以总共占了12字节
内存对齐的用处
ID | ID | HP | HP | HP | HP | ... |
我们可以通过一些手段,强行将HP不对齐,这样系统在读取HP的时候,就会先读取前两个字节的HP,再读取后两个字节的HP,再将它组合成一个HP,我们在写一些程序时,可以用这种方式,避免被系统读取到。