繁体   English   中英

C结构对齐

[英]C structure alignment

我正在尝试了解结构如何对齐。 根据此消息 ,我本来希望该结构

#include<inttypes.h>
#include<stdio.h>

typedef struct {
  uint16_t a;
  uint16_t b;
  uint32_t c;
} test_struct;

int main (int argc, char const *argv[])
{
  printf("%lu\n", sizeof(test_struct));
  return 0;
}

具有12个字节的大小。 在我的示例中,它仅占用8个字节。 因为它包含一个32位整数,所以我认为应该将其对齐为4个字节,显然不是这种情况。

环顾四周后,我发现了这个答案 ,这表明,不仅成员本身需要保持一致。

这完全可以解释我的结构的大小,但是,这与我的第一个来源声称“结构实例将具有其最宽的标量成员的对齐”的排列方式如何一致? 那是错的还是我错过了什么?

您的两个来源都是正确的。

typedef struct {
uint16_t a; // 2 bytes
uint16_t b; // 2 bytes
uint32_t c; // 4 bytes
} test_struct;

结构的总大小为8个字节。 为了确定是否需要填充,我们检查了最宽的标量成员(4个字节),并检查该数字是否可被总大小整除而不填充。

8 % 4 == 0

因此,我们不需要填充。

如果我们有:

typedef struct {
uint16_t a; // 2 bytes
uint16_t b; // 2 bytes
uint32_t c; // 4 bytes
uint16_t d; // 2 bytes
} test_struct;

总大小:10个字节

12 % 4 == 2

需要填充:2个字节

实际总大小:12个字节

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM