考虑以下示例:
#include <stdio.h>
#include <inttypes.h>
struct A {
uint32_t i1;
uint32_t i2;
uint32_t i3;
uint64_t i4;
uint32_t i5;
uint32_t i6;
uint32_t i7;
uint64_t i8;
uint32_t i9;
};
struct B {
uint32_t i1;
uint32_t i2;
uint32_t i3;
uint32_t i4;
uint32_t i5;
uint32_t i6;
uint32_t i7;
uint64_t i8;
uint64_t i9;
};
int
main()
{
struct A a;
struct B b;
printf("sizeof(a) = %u, sizeof(b) = %u\n", sizeof(a), sizeof(b));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
$ ./t2
sizeof(a) = 56, sizeof(b) = 48
$
Run Code Online (Sandbox Code Playgroud)
他们为什么在64位机器上有所不同?在32位平台上的结果是相同的:
$ ./t2
sizeof(a) = 44, sizeof(b) = 44
Run Code Online (Sandbox Code Playgroud)
Jul*_*ano 23
一些图表可以帮助您了解:
32位:
+----+----+----+----+----+----+----+----+----+----+----+
| i1 | i2 | i3 | i4 | i5 | i6 | i7 | i8 | i9 | Struct A
+----+----+----+----+----+----+----+----+----+----+----+
+----+----+----+----+----+----+----+----+----+----+----+
| i1 | i2 | i3 | i4 | i5 | i6 | i7 | i8 | i9 | Struct B
+----+----+----+----+----+----+----+----+----+----+----+
Run Code Online (Sandbox Code Playgroud)
64位:
+---------+---------+---------+---------+---------+---------+---------+
| i1 | i2 | i3 |~~~~| i4 | i5 | i6 | i7 |~~~~| i8 | i9 |~~~~| Struct A
+---------+---------+---------+---------+---------+---------+---------+
+---------+---------+---------+---------+---------+---------+
| i1 | i2 | i3 | i4 | i5 | i6 | i7 |~~~~| i8 | i9 | Struct B
+---------+---------+---------+---------+---------+---------+
Run Code Online (Sandbox Code Playgroud)
编译器通过边界(在编译尝试中不同)对齐struct成员.
添加一个
#pragma pack (1)
Run Code Online (Sandbox Code Playgroud)
指令在源文件的开头并重试.