【问题标题】:Byte array unioned with a struct (byte aligment)与结构联合的字节数组(字节对齐)
【发布时间】:2013-05-21 12:54:57
【问题描述】:

我想在一个联合中组合一个结构和一个字节数组。编译器是gcc。

以下是否被认为适用于 32 位嵌入式控制器 (AVR)? 我需要担心字节对齐吗?

#include <stdint.h>

typedef int8_t S8;

typedef union {
    struct {
        S8 a;
        S8 b;
        S8 c;
        S8 d;
        S8 e;
    };
    S8 array[5];
} s_t;

初始化:

s_t s = {.array = {0, 0, 0, 0, 0}};

访问:

s.a = 50;
s.c = 42;

【问题讨论】:

  • 编译器可能一直在处理该自动。字节顺序很重要。
  • 你应该使用stdint.h数据类型uint8_t而不是char
  • @claptrap,谢谢。我已经编辑了问题。

标签: c struct unions memory-alignment avr-gcc


【解决方案1】:

我认为您展示的内容很好,但是如果您曾经使用 s_t 的数组,您应该担心,因为最后可能会有填充。

您可以告诉 GCC 使用扩展 __attribute__ 语法“打包”结构。在最后的; 之前添加__attribute__((packed))

【讨论】:

  • 我不认为结构末尾的填充是一个问题,在现实生活中(即使 C 标准不保证它)。结构的对齐方式继承自它的成员,因为它们都是 8 位实体,它们都不会提高结构的对齐方式。另一方面,packed 结构是我完全不鼓励您使用的东西!它不是 C 标准的一部分,人们真的不知道使用它的后果是什么。
  • 在我看来,packed 结构/联合是确保结构或联合以可预测的方式在内存中布局的唯一方法方式。例如,根据目标架构,编译器可能会选择将每个 1 字节 变量 分配给内存中它自己的 4 字节字,这只是默默地中断了对这些变量的数组访问。
猜你喜欢
  • 1970-01-01
  • 2012-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-13
  • 2017-07-28
  • 2011-06-20
  • 2020-01-18
相关资源
最近更新 更多