抱歉,如果标题有点歪斜,我想不出一个简明的解释来说明我在说什么!
无论如何,我们有一个嵌入式系统,将其设置数据存储在一个小型 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/