gpt4 book ai didi

c++ - 在 C++ 中填充仅包含一个 int 数组成员的结构?

转载 作者:太空狗 更新时间:2023-10-29 21:40:04 26 4
gpt4 key购买 nike

提供仅包含一个短数组(字节、<cstdint> 中的整数等)的简单结构 (POD),以后不会添加更多字段:

#define FIXED_SIZE 128 // 'fixed' in long term, shouldn’t change in future versions
struct Foo {
uint16_t bar[FIXED_SIZE];
};

是否有可能出于任何原因在编译器添加的结构末尾添加填充?

不做任何填充似乎是合理的,因为它没有任何明显的需要,但它是否有任何标准保证(您能否在解释的地方提供任何链接)?

稍后我想在不同平台内的简单序列化 (IPC) 中使用 Foo 结构数组,并且不想为这个简单的任务使用任何库(为了演示而简化的代码):

#define FOO_ELEMS 1024
...
// sender
Foo *from = new Foo[FOO_ELEMS];
uint8_t *buff_to = new uint8_t[FOO_ELEMS * FIXED_SIZE * sizeof(uint16_t) ];
memcpy(buff_to, from, ...);
...
// receiver
uint8_t *buff_from = new uint8_t[ ... ];
Foo *to = new Foo[FOO_ELEMS];
memcpy(to, buff_from, ...);

我想在这里使用 struct 而不是普通数组,因为它将是 struct 中的一些辅助方法,而且看起来比使用普通函数 + 数组指针更方便。

与这个(纯 C)问题相交,但对我来说似乎有点不同: Alignment of char array struct members in C standard

最佳答案

各种标准规定要进行填充(但不是在开始时)。完全没有严格要求只会出现对齐数组中的成员和对象。

所以真正符合要求的答案是:

是的,可能有填充,因为编译器可以添加它,但不能在开头或数组元素之间添加。

也没有强制打包的标准方法。

然而,每次出现这种情况以及每次我询问时,都没有人在平台上识别出一个真正的编译器,该编译器出于内部对齐和数组对齐之外的任何其他原因填充结构。

因此,出于所有已知的实际目的,该结构不会打包在任何已知平台上。

请考虑这是对某人找到打破该原则的真实平台的又一次请求。

关于c++ - 在 C++ 中填充仅包含一个 int 数组成员的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31246740/

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