gpt4 book ai didi

c++ - 数据结构对齐

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:44:46 24 4
gpt4 key购买 nike

因此,我正在编写一些数据包结构(以太网、IP 等)并注意到其中一些后跟属性((packed)),这会阻止 gcc 编译器尝试添加填充给他们。这是有道理的,因为这些结构应该连接到电线上。

但后来,我数了数:

struct ether_header
{
u_int8_t ether_dhost[ETH_ALEN]; /* destination eth addr */
u_int8_t ether_shost[ETH_ALEN]; /* source ether addr */
u_int16_t ether_type; /* packet type ID field */
} __attribute__ ((packed));

这是从网站复制的,但我的代码还使用了 2 个 uint8_t 和 1 个 uint16_t。这加起来为两个字(4 个字节)。

根据来源,系统更喜欢根据 4,8 甚至 16 位的倍数对齐结构。所以,我不明白为什么 attribute((packed)) 是必要的,因为 afaik 这不应该被打包。

另外,为什么双括号((打包))为什么不使用一对?

最佳答案

如果你的结构已经是正确大小的倍数,那么不,__attribute__((packed)) 不是绝对必要的,但它仍然是一个好主意,以防你的结构大小永远因任何原因而改变。如果您添加/删除字段,或更改 ETH_ALEN,您仍然需要 __attribute__((packed))

我相信双括号是使您的代码与非 gcc 编译器兼容变得容易的必要条件。通过使用它们,您可以执行以下操作:

#define __attribute__(x)

然后您指定的所有属性都将消失。额外的括号意味着只有一个参数传递给宏(而不是一个或多个),无论您指定多少属性,并且您的编译器不需要支持可变参数宏。

关于c++ - 数据结构对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1678044/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com