使用C联盟"保留"数据空间 - 合理吗?

Joh*_*n U 3 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...
   };
 }
Run Code Online (Sandbox Code Playgroud)

一切都很好,直到我们需要在_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...
      };
   };
 }
Run Code Online (Sandbox Code Playgroud)

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

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

Eri*_*hil 6

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

正如你的问题,联盟可能是100个字节.假设您double在结构中添加了一个(我们假设)需要八字节对齐的结构.然后编译器使联合104字节,使其大小为8的倍数(这是必要的,以便联合的数组将保持所需的对齐).

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