指针和结构体

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<

输出结果为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,我们在写一些程序时,可以用这种方式,避免被系统读取到。

你可能感兴趣的:(c++)