在 C 结构中强制填充

Force the padding inside a C struct

我想知道是否有办法强制填充 C 结构的字段。 我将尝试用一个例子更好地解释它: 如果我有以下结构:

struct foo{
    int32 a,
    int16 b,
    int8 c,
    int32 d,
    int32 e
};

我想按以下方式映射它(考虑 0x00 作为起始地址:

&foo.a = 0x00
&foo.b = 0x08
&foo.c = 0x0A
&foo.d = 0x10
&foo.e = 0x18

以便字段以 4 个字节的形式打包,每 8 个字节。

我显然知道我可以插入 "padding fields",但这是唯一的解决方案吗?

这个结构定义:

struct foo{
    int32 a,
    int16 b,
    int8 c,
    int32 d,
    int32 e
};

根据以下内容填充:

struct foo{  <-- aligned on a 32 bit address boundary by compiler
    int32 a, <-- +0 
    int16 b, <-- +4
    int8 c,  <-- +6
             <-- +7 (1 byte padding)
    int32 d, <-- +8
    int32 e  <-- +12  (not +16 as indicated in posted code)
};

C11 有 _Alignas 说明符。本声明:

#include <stdio.h>
#include <stdint.h>

struct foo {
    _Alignas(8) int32_t a;
    _Alignas(4) int16_t b;
    _Alignas(4) int8_t c;
    _Alignas(8) int32_t d;
    _Alignas(8) int32_t e;
};

#define OFF(s, f)   ((uintptr_t)(&(s).f) - (uintptr_t)(&(s)))

int main() {
    char x;
    struct foo foo;

    printf("%p %x %x %x %x %x\n", (uintptr_t)(&foo), OFF(foo, a), OFF(foo, b), 
                                OFF(foo, c), OFF(foo, d), OFF(foo, e));
}

提供您要求的精确对齐:

0x7fff6cbf2780 0 4 8 10 18

使用 gcc 4.8.3 和 -std=gnu11 在 x86_64 上编译。