3

我有一个结构:

struct foo {
  struct {
     int a;
     int b;
     long len;
     unsigned short c;
     unsigned short d;
  };
  char payload[1024];
} bar;

我想在配置时找出是否需要插入填充以使“有效负载”双对齐。

Autoconf 提供AC_CHECK_SIZEOF(type)and AC_CHECK_ALIGNOF(type),但我真正需要的是类似AC_CHECK_OFFSETOF(type, member). 如果报告的偏移量不是双对齐的,我可以引入足够的填充来做到这一点。

我可以运行一个报告的小测试程序offsetof(struct bar, payload),但我不想在我的构建系统中引入运行时检查(我们经常交叉编译)。

4

3 回答 3

1

您可以使用AC_COMPUTE_INT

AC_COMPUTE_INT([payload_offset], [offsetof(struct bar, payload)], ...)

但是使用匿名联合来强制对齐可能会更容易:

struct foo {
  struct {
     int a;
     int b;
     long len;
     unsigned short c;
     unsigned short d;
  };
  union {
    char payload[1024];
    double dummy; /* for alignment */
  };
} bar;

如果您不想使用联合,则可以就地计算填充:

struct foo {
  struct header {
     int a;
     int b;
     long len;
     unsigned short c;
     unsigned short d;
  };
  char padding[(alignof(double) - 1) - ((sizeof(struct header)
      + alignof(double) - 1) % alignof(double))];
  char payload[1024];
} bar;
于 2013-11-01T17:25:40.853 回答
1

使用零长度位域可以在没有自动工具技巧的情况下解决这个问题。

struct foo {
  struct {
     int a;
     int b;
     long len;
     unsigned short c;
     unsigned short d;
  };
  int64_t : 0; // or long long whatever integer type is sizeof(double)
  char payload[1024];
} bar;
于 2013-11-01T17:28:58.330 回答
0

我真的不认为 autoconf 可以告诉你,因为这是编译器决定添加或不添加填充的问题。所以我认为唯一合理的方法是编译一个程序来检查成员的偏移量是否等于你认为它应该相等的值。

于 2013-11-01T17:46:25.600 回答