在 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 上编译。
我想知道是否有办法强制填充 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 上编译。