首页 > 解决方案 > GNU GCC 编译器 - 了解结构中的对齐属性

问题描述

我无法理解 C 中结构中的对齐属性。

gcc 手册

此属性为指定类型的变量指定最小对齐方式(以字节为单位)。例如,声明:

  struct S { short f[3]; } __attribute__ ((aligned (8)));
  typedef int more_aligned_int __attribute__ ((aligned (8)));

强制编译器确保(尽可能)类型为 struct S 或 more_aligned_int 的每个变量将被分配并至少在 8 字节边界上对齐。

从上面的段落中我了解到,__attribute__((aligned(x)))在 C 中添加任何类型的变量都会强制编译器为受影响的变量分配至少x个字节的大小。例如:

#include <stdint.h>
#include <stdio.h>

uint8_t foo __attribute__((aligned(4)));

typedef struct {
  uint8_t x;
  uint32_t y;
  uint8_t z;
} __attribute__((aligned(8))) ex_struct_aligned_8_t;

int main(){

  printf("Data/Structure Sizes:\n");
  printf("  Aligned uint8_t Variable: %zu\n",sizeof(foo));
  printf("                 Aligned-8: %zu\n", sizeof(ex_struct_aligned_8_t));

  return 0;
}

根据我的理解,输出sizeof(foo)应该是 4,输出sizeof(ex_struct_aligned_8_t)应该是 8。将结构中每个元素的大小加起来总共是 6 个字节,所以整个结构应该完全适合 8 个字节的内存对齐。尽管如此,当执行代码时,打印的值分别为 1 和 16。

我在这里缺少什么吗?也许它与架构有关?我在 gcc 版本 7.5.0 的 64 位操作系统(Ubuntu 18.04)中运行代码。

标签: cgcc

解决方案


推荐阅读