gpt4 book ai didi

c++ - 准确计算编译器在结构中添加的填充

转载 作者:搜寻专家 更新时间:2023-10-31 01:06:15 25 4
gpt4 key购买 nike

我目前有以下结构

struct foo {
u32 bar;
u8 baz[1];
}

由于填充,sizeof(struct foo) 结果为 8。

如果我想要准确的结构大小(在本例中为 5),我将如何以“可扩展”的方式进行计算(即不做类似 sizeof(foo.bar) + sizeof (foo.baz))?

最佳答案

在标准 C 中,如果不在源代码中列出它们,就无法计算结构成员的总大小(这可能需要借助预处理器功能或使用其他代码 [已编译和执行]在最终代码的编译时]生成最终代码)。这是因为标准 C 不提供任何方法来遍历结构的成员或以其他方式检查其组成而不使用其成员的名称。

我会对 C++ 做出同样的声明,除了一些可怕的 hack 可能会使用模板和诸如此类的东西。我倾向于那是不可能的,但我还没有检查最新 C++ 标准中的所有新功能。

在任何情况下,计算总大小对于序列化和反序列化成员的既定目的是不够的(即将成员转换为网络包中的字节,反之亦然),因为您仍然需要单独转换成员,而不仅仅是知道他们的大小的总和。

接近目标的选项包括:

  • 使用特定于实现的功能来打包结构,使其不包含填充。然后你可以写入和读取结构的字节来执行序列化和反序列化。您仍然需要确保发送和接收系统之间的类型匹配(相同宽度的整数、相同格式的浮点值、相同的字符集编码,等等)。
  • 为所需类型的运行时处理编写代码。它将采用某种格式(例如类型列表)对结构进行描述,并对每种类型都有案例。每个案例都将包含该类型的编译时代码(例如,sizeof(float)),但代码会在运行时在案例之间进行调度。因此,您需要按照此代码使用的格式准备结构描述。

关于c++ - 准确计算编译器在结构中添加的填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21150049/

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