小编es4*_*483的帖子

我如何确定此 C 结构在 32 位和 64 位系统上均已打包?“__attribute__((packed))”总是必要的吗?

我正在尝试构建一个简单的自定义应用程序层协议,本质上是携带时间戳以及一些其他有用的信息,以便在不同的 Linux 系统之间执行少量网络测量。

在我最初的想法中,就 Linux 系统而言,该实现应该在不同平台(x86、ARM 等)之间尽可能可移植。

为了管理标头,我创建了以下结构:

struct myhdr {
    __u8 reserved; // 1 byte
    __u8 ctrl; // 1 byte
    __u16 id; // 2 bytes
    __u16 seq; // 2 bytes
    __u16 len; // 2 bytes
    struct timeval sendtime; // 8 or 16 bytes
};
Run Code Online (Sandbox Code Playgroud)

之后,一些有效负载数据可能存在也可能不存在(如果 len=0)。由于这些数据必须通过网络发送,如果我没记错的话,我需要打包结构,而不需要任何对齐填充。

我的疑问实际上是这是否可以被认为是已经打包的,主要是因为struct timeval, 的存在来携带时间戳。

32位系统下,struct timeval应该是8字节。在64位系统下,它应该是16字节(刚刚通过打印测试过sizeof(struct timeval))。

在 32 位系统下,由于 1+1+2+2+2 字节 = 8 字节(即 的大小),可以安全地假设它已经打包了sendtime?或者在任何情况下都会添加填充,以便将每个字段与最后一个字段(最大的字段)对齐?

那么在最后一个字段为 16 字节的 64 位系统中会发生什么?我认为无论如何,该结构将不再“按布局打包”(这是正确的吗?)。

添加__attribute__((packed))足够的且始终必要的内容来确保在针对不同平台编译代码时结构被打包?有更好的解决方案吗?

c attributes gcc struct packed

2
推荐指数
1
解决办法
1386
查看次数

标签 统计

attributes ×1

c ×1

gcc ×1

packed ×1

struct ×1