在结构中使用可变长度数组的最佳做法是什么? 说
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 array的最佳做法是什么?
答案 0 :(得分:1)
除非你有特别的理由希望data
是4字节对齐的(如果是,为什么它是uint8
?),第一个是温和的,因为它是'我会节省几个字节。对于像这样的可变长度结构,sizeof
报告的值并不是真正相关的,正是出于这个原因。如果你决定为它分配sizeof(foo_t) + data_len
个字节,那么你将浪费几个字节,但无论如何你都要在第二个结构定义中填充它们。
答案 1 :(得分:1)
如果你想在不牺牲对齐的情况下打包你的结构,那么是:最好的选择是按顺序递减或递增元素。数组必须是最后一个元素,所以这里你最好的选择是递减顺序(请注意,尺寸获胜很小,只有你有一大堆结构才有意义,但是你可以使用灵活的阵列成员有一系列结构)。