c - 如果结构中只包含字符,它是否有填充?
问题描述
struct dummy {
unsigned char a;
unsigned char b;
unsigned char c;
};
这是否会导致在任何情况下添加填充?
解决方案
虽然这很不寻常,但实现本身决定了该结构是否具有填充,而不是标准(在本例中为 C11)。
该标准在6.7.2.1 Structure and union specifiers
(仅显示相关段落)中规定:
14/结构或联合对象的每个非位域成员以适合其类型的实现定义的方式对齐。
15/ 在结构对象中,非位域成员和位域所在的单元的地址按声明顺序递增。一个指向结构对象的指针,经过适当的转换,指向它的初始成员(或者如果该成员是位域,则指向它所在的单元),反之亦然。结构对象中可能有未命名的填充,但不是在其开头。
17/ 结构或联合的末尾可能有未命名的填充。
所以:
- 该实现定义了对齐方式,因此定义了填充(来自
14
)。 - 开始时没有填充,但成员之间允许填充(从
15
)。仅允许出于对齐的原因进行填充是没有什么的,允许出于任何目的进行填充,包括“实施者的突发奇想”。唯一的要求是地址随着后续成员的增加而增加,而不是根据其大小和对齐方式增加尽可能小的数量。 - 在最后一个成员(来自)之后允许填充
17
,再次出于任何原因。
推荐阅读
- python - Bert 模型在 google colab 上给出 CUDA 内存不足错误
- time-complexity - 给定代码的时间复杂度是多少
- python - 如何绘制二项式函数?
- java - 处理:意外令牌
- c++ - 如何在 C++ Visual Studio 中获得此输出?
- azure-devops - 提交者触发持续部署
- python - 在python中广播一个M*D矩阵到N*D矩阵(D大于1,M>N)
- gatsby - 如何使用 gatsby-source-facebook 拉帖子
- arrays - 如何在数组中找到总和等于或小于且更接近给定值的元素?
- node.js - 无法将 Postgres 与 NodeJS 连接(Docker Compose)