指针占的字节数和内存对齐

  定义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__如何指定,结构体内部成员的自对齐仍然按照其自身的对齐值。

 

posted @ 2018-04-04 16:44  Pumpkin0227  阅读(540)  评论(0编辑  收藏  举报