在结构中使用可变长度数组的最佳实践是什么? 说
typedef struct foo_s {
uint32_t data_type;
uint16_t data_len;
uint8_t data[];
} foo_t;
在装有 Gcc 4.8 的 x86_64 机器上,我得到了
sizeof(foo_t) == 8, but
offsetof(foo_t, data) == 6
看起来有一个区别,data_len 之后没有填充,但结构有填充。 我应该始终将最大的成员放在最后以避免这种情况吗?即
typedef struct foo_s {
uint16_t data_len;
uint32_t data_type;
uint8_t data[];
} foo_t;
使用 var len 数组的最佳实践是什么?
最佳答案
除非您有特殊原因希望 data
4 字节对齐(如果是这样,为什么它是 uint8
?),第一个是温和的更好,因为它会为您节省几个字节。对于这样的可变长度结构,sizeof
报告的值并不真正相关,正是由于这个原因。如果您决定为其分配 sizeof(foo_t) + data_len
字节,那么您将浪费几个字节,但无论如何您都会在第二个结构定义中的填充中浪费它们。
关于c - 零长度数组的结构填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25538260/