为什么只填充一个字节,而不是填充3个字节
时间: 2024-03-15 08:44:32 浏览: 27
这个问题涉及到内存对齐的原理。
在内存中,CPU按照特定的字节对齐方式来访问数据,即访问某个地址时,访问的数据应该是该地址的整数倍。例如,如果字节对齐方式为4字节,那么访问地址0x1000时,应该访问0x1000、0x1004、0x1008等地址上的数据,而不是0x1001、0x1002、0x1003等地址上的数据。
为了满足字节对齐的要求,编译器在分配内存时会在结构体成员之间填充一些无用的字节。具体来说,假设我们有一个结构体如下所示:
```c
struct example {
char a;
char b;
int c;
};
```
在该结构体中,char类型的成员a和b共占用2个字节,int类型的成员c占用4个字节。如果我们按照4字节对齐方式进行内存分配,那么结构体example在内存中的分配情况可能如下所示:
```
0x1000: a (1 byte)
0x1001: Padding (1 byte)
0x1002: b (1 byte)
0x1003: Padding (1 byte)
0x1004: c (4 bytes)
```
可以看到,为了保证结构体成员按照4字节对齐方式进行内存分配,编译器在成员a和b之间填充了1个字节的无用空间,成员b和成员c之间填充了3个字节的无用空间。
回到你的问题,为什么只填充一个字节,而不是填充3个字节。这是因为在x86架构中,结构体成员的对齐方式通常是按照成员大小进行对齐。例如,char类型的成员对齐方式为1字节,short类型的成员对齐方式为2字节,int类型的成员对齐方式为4字节。因此,对于char类型的成员a和short类型的成员b,它们的对齐方式都是1字节,因此只需要填充1个字节的无用空间即可满足对齐要求,而不需要填充3个字节的无用空间。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)