c - 零长度数组的结构填充

标签 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 数组的最佳实践是什么?

最佳答案

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

关于c - 零长度数组的结构填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25538260/

相关文章:

objective-c - 有没有更好的方法来删除 objective-c 中的停用词?

c++ - 使用 Visual Studios 2012 进行 C++ 编码时,如何自动完成在 IntelliSense 中选择的代码?

c - 启动 C 程序的问题

链接器可以内联函数吗?

c++ - DirectX 9 HLSL 与 DirectX 10 HLSL : syntax the same?

c - 如何将二维字符串数组分配给字符指针数组?

c - 段错误:11

android - 通过信号调用 Android NDK 项目中的 ffmpeg 部分来终止进程

c - gstreamer 插件库未链接到 opencv 共享对象库 - Ubuntu 上的 "undefined symbol"

c++ - 我可以(ab)为游戏中的每个类似 vector 的容器使用 VirtualAlloc 吗?