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

Posted 南瓜小屋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了指针占的字节数和内存对齐相关的知识,希望对你有一定的参考价值。

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

 

以上是关于指针占的字节数和内存对齐的主要内容,如果未能解决你的问题,请参考以下文章

编程技巧C结构体设计技巧

结构体内存的对齐方式

Go 内存对齐的那些事儿

C语言结构体变量字节对齐问题总结

嵌入式 C 结构体内存对齐

怎么确定Java对象的大小