【技术研究】结构体访问

TEC

Posted by Corax on November 19, 2023

结构体

image-20231120185154302

如上结构体在定义的时候,内存如下变换

image-20231120185411916

总大小32字节

image-20231120185539312

调换次序后

image-20231120193916247

还是32字节

有个结构体对齐

image-20231120194334025

原则是这样的:

设对其值为ZP

结构体成员的地址和结构体首地址之差为offset

设结构体成员类型为member type

必须满足

offset % min(Zp, sizeof(member type)) == 0

定义结构体自身(它本身是个类型)对齐值为StructAlig

image-20231120200616303

设整个结构体空间长度为size

满足

image-20231120200626853

第一个

image-20231120200012885

第一个就是0

第二个

原本对其是加六的位置,因为刚刚的那个前面五个字符。

image-20231120200210793

然后开始往上加, x % 4 应该是8,所以从8开始

第三个

自然对其加12

image-20231120200304471

现在应该是16

所以16开始

image-20231120200404881

总共

image-20231120200748701

所以其实大小应该是40,要对齐。

image-20231120201450811

0
6
14
18
20
22
26
0
8
16
20
22
24

而像这样

image-20231120202036322

image-20231120202041658

里面包含一个结构体

先算出这里的size

image-20231120202138107

然后用到tagStudent里面

image-20231120202201330

image-20231120202229750这玩意可以改变编译选项

小范围改变

image-20231120202445107

编译器角度 符号实际上就是带符号的变量地址

没有ngender 只是 +24即可

带指针直接加上偏移即可

image-20231120202655110

image-20231120202836065

可以做一个宏 取个巧

image-20231120203018331