请考虑:

struct mystruct_A
{
   char a;
   int b;
   char c;
} x;

struct mystruct_B
{
   int b;
   char a;
} y;

struct 尺寸分别为12和8.

这些 struct 是填充的还是打包的?

什么时候进行填充或包装?

推荐答案

Padding aligns个 struct 成员"自然"寻址边界——例如,int个成员将具有偏移量,在32位平台上为mod(4) == 0.默认情况下,"填充"处于启用状态.它会在第一个 struct 中插入以下"间隙":

struct mystruct_A {
    char a;
    char gap_0[3]; /* inserted by compiler: for alignment of b */
    int b;
    char c;
    char gap_1[3]; /* -"-: for alignment of the whole struct in an array */
} x;

Packing,另一方面防止编译器进行填充-这必须明确要求-在GCC下为__attribute__((__packed__)),因此如下所示:

struct __attribute__((__packed__)) mystruct_A {
    char a;
    int b;
    char c;
};

将在32位体系 struct 上产生大小为6的 struct .

不过需要注意的是,在允许未对齐内存访问的体系 struct (如x86和amd64)上,未对齐内存访问速度较慢,在SPARC等strict alignment architectures上,未对齐内存访问被明确禁止.

C++相关问答推荐

是否可以在C中进行D3 D12申请?

为什么静态说明符为内联函数生成外部定义?

为什么信号量为空= 0,而不是阻塞?

如何将已分配的数组(运行时已知的大小)放入 struct 中?

显式地将值转换为它从函数返回的类型的含义是什么?

如何调试LD_PRELOAD库中的构造函数?

C是否用0填充多维数组的其余部分?

为什么我可以在GCC的标签后声明变量,但不能声明Clang?

在句子中转换单词的问题

C指针概念分段故障

S和查尔有什么不同[1]?

试图创建一个基本的Word克隆,但遇到了障碍

c程序,让用户输入两类数字,并给出输出用户输入多少个数字

当我将偏移量更改为任何非零值时,C中的mmap共享内存出现无效参数错误

x86-64平台上的int_fast8_t大小与int_fast16_t大小

C 和 C++ 标准如何告诉您如何处理它们未涵盖的情况?

使用fread()函数读取txt文件

clion.我无法理解 Clion 中发生的 scanf 错误

与 C 相比,C++ 中无副作用的无限循环的好处是 UB?

可以从指针数组中的值初始化指针吗?