c - 使用 C union 到数据中的 "reserve"空间 - 合理吗?

标签 c embedded storage unions

抱歉,如果标题有点歪斜,我想不出一个简明的解释来说明我在说什么!

无论如何,我们有一个嵌入式系统,将其设置数据存储在一个小型 SPI EEPROM/Flash 芯片中。在一个非常基本的形式中,它是一个包含设置数据的结构,简化版本可能如下所示:

struct settings_data
{
   struct factory_data
   { // Data set at the factory
      uint32 serial_number;
      uint32 calibration;
   };
   struct user_data
   { // User-configured data follows:
      uint8  user_data_1;
      uint8  user_data_2;
      char[10]  somestring;
      // etc...
   };
 }

一切都很好,直到我们需要将一个额外的值添加到 _factory_data_ 中,此时它移动后的所有内容。

现在,有很多的方法来处理这个问题,但这个问题不是要找到一个不同的方法,而是这个想法是否合理填充数据结构,以便在您添加东西时它们不会移动:

struct settings_data
{
   union factory_union
   {
      uint8 padding[100]; // Effectively reserve 100 bytes space
      struct factory_data
      { // Data set at the factory
         uint32 serial_number;
         uint32 calibration;
      };
   };
   union user_union
   {
      uint8 padding[100]; // Effectively reserve 100 bytes space
      struct user_data
      { // User-configured data follows:
         uint8  user_data_1;
         uint8  user_data_2;
         char[10]  somestring;
         // etc...
      };
   };
 }

如果我对 union 的理解正确,这将在 settings_data 结构中保留 100 字节的存储空间,并且我们添加到 union 内“真实”数据结构的任何新成员都不会导致 union 增长,除非我们超过 100 字节。

问题是,鉴于我们的资源相对有限,这是实现这一目标的合理方法吗?

最佳答案

这是合理的,但是即使结构仍然小于填充元素,当您的结构发生变化时, union 的大小也可能发生变化。

在您的问题中, union 可能是 100 个字节。假设您将 double 添加到结构中,(我们假设)它需要八字节对齐。然后编译器使 union 为 104 字节,因此它的大小将是 8 的倍数(这是必要的,以便 union 的数组保持所需的对齐)。

您可以通过使填充成为您将来可能添加的所有类型的对齐要求的倍数来避免这种情况。

关于c - 使用 C union 到数据中的 "reserve"空间 - 合理吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20543341/

相关文章:

c - 混合有符号和无符号整数时的不合理行为

linux - 通过 NFS : Loops on "Sending DHCP and RARP requests ..." 使用根文件系统引导 Linux

c++ - 有没有一种方法可以将数据直接编码到硬盘驱动器(类似于使用 RAM 的方式)?

c - 从 C 文本文件中读取行时忽略前导空格

c - 如何优化分配固定红利?

c - ASF4 Microchip API定时器驱动复位函数

android - 从蓝牙到 UART 的数据丢失

c# - 如何从 Amazon S3 Bucket 获取最早添加的对象?

java - 存储在外部存储卡上

c - 如何在makefile中写入安装标签?