【问题标题】:Alignment of struct didn't work with #pragma pack结构的对齐不适用于#pragma pack
【发布时间】:2014-03-01 08:43:27
【问题描述】:

我有一个 c++ 结构:

struct a
{
     char b;
     int c;
     int d[100];
};

结构的大小应为 405 字节。 我看到结构的大小是 408 字节。原因是整数“c”之后的 8 个字节对齐。数组“d”应该从结构的第 6 个字节开始,而不是从第 9 个字节开始。 我使用了#pragma pack(1),但并没有解决问题。 我无法更改结构中字段的顺序。 你知道我该如何解决这个问题吗? 谢谢!

【问题讨论】:

  • 使用哪个编译器?在哪个系统上?为什么需要这个?
  • Visual Studio 的默认编译器。视窗。我需要将此结构发送到远程计算机
  • 问题是我发送的结构比期望的尺寸大
  • 这是一个将它序列化并考虑字节序的想法。然后让它通过网络免费
  • 使用 gcc 4.8 或 clang 3.5 sizeof(a) 是 405 字节 - 带有 pragma pack 指令。

标签: c++ struct pragma


【解决方案1】:

我使用的大多数编译器的错误打包是对象根据自己的大小对齐。结构的默认打包将在 char 之后和第一个 int 之前插入填充,以将该 int 放置在 4 字节边界上。显然这是您所看到的行为。

我在 Visual Studio 上用来实现打包的代码是这样的。

#pragma pack(push,1)
struct a {
  char b;
  int c;
  int d[100];
};
#pragma pack(pop)

它移除填充,将 int 对齐到字节 1。

如果我有时间,我会在几个版本的 VS 上检查它以确认这一点,但我当前的代码完全像这样工作。这就是它的完成方式,所以唯一的问题是它为什么不适合你。

编辑:sizeof(a) 是预期的 405。 b 的偏移量为 1。VS2012。 gcc 也一样。

【讨论】:

    猜你喜欢
    • 2013-01-24
    • 2014-04-23
    • 1970-01-01
    • 2021-02-05
    • 2020-02-18
    • 2012-03-15
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    相关资源
    最近更新 更多