具有零长度数组的结构填充

时间:2014-08-27 23:02:16

标签: c

在结构中使用可变长度数组的最佳做法是什么? 说

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的最佳做法是什么?

2 个答案:

答案 0 :(得分:1)

除非你有特别的理由希望data是4字节对齐的(如果是,为什么它是uint8?),第一个是温和的,因为它是'我会节省几个字节。对于像这样的可变长度结构,sizeof报告的值并不是真正相关的,正是出于这个原因。如果你决定为它分配sizeof(foo_t) + data_len个字节,那么你将浪费几个字节,但无论如何你都要在第二个结构定义中填充它们。

答案 1 :(得分:1)

如果你想在不牺牲对齐的情况下打包你的结构,那么是:最好的选择是按顺序递减或递增元素。数组必须是最后一个元素,所以这里你最好的选择是递减顺序(请注意,尺寸获胜很小,只有你有一大堆结构才有意义,但是你可以使用灵活的阵列成员有一系列结构)。