定义hash节点的时候用到了构成双向链表的指针,想起来铮哥前些天说过的内存对齐,于是sizeof()了一下Node*的指针,发现指针是占4字节的,又用int*和char*都测试了一下,发现都是4字节。(我的操作系统是64位的。。。应该是因为我的visual studio软件是32位的原因)
内存对齐例子:
1.
struct AA{
char a;
int b;
char c;
}aa
结果,sizeof(aa)=12 何解?首先假设结构体内存起始地址为0,那么地址的分布如下
0 a
1
2
3
4 b
5 b
6 b
7 b
8 c
9
10
11
2.
struct AA{
char a;
char c;
int b;
}aa
sizeof(aa)=8,为什么呢
0 a
1 c
2
3
4 b
5 b
6 b
7 b
因为c为char类型,字对齐长度为1,所以可以有效的利用1-3间的空格。看见了吧,变量定义的位置的不同时有可能影响结构体的大小的哦!
3.
#pragma pack(2)
struct AA{
char a;
int b;
char c;
}aa
sizeof(aa)=10 (用64位WIN10+ 32bit VS2017 实验输出是8?)
为什么呢?a到c只占9字节长度,因为结构体的有效对齐长度在pack指定的2和int的4中取较小的值2。故取2的倍数10。如果当pack指定为8呢?那就仍然按4来对齐,结果仍然是12。
4.
struct AA{
char a;
int b;
char c;
}__attribute__((__8__))aa
sizeof(aa)=16,)
为咩?其实a到c仍然只占9字节长度,但结构体以8对齐,故取8的倍数16.如果其指定2,则结果为10
如果pragma pack和__attribute__ 同时指定呢?以__attribute__ 的为准。
需要说明的是,不管pragma pack和__attribute__如何指定,结构体内部成员的自对齐仍然按照其自身的对齐值。