c - Linux/IA32下的数据对齐
问题描述
我遇到了两个结构:
struct s1{
int i;
int j;
char c;}
struct s2{
int i;
char c1;
int j;
char c2;}
教科书上说S1中的c只占1个字节,而S2中的c2占4个字节,这是为什么呢?是不是因为 c1 必须占用 4 个字节,而且它们的类型相同?
解决方案
在 i386 System V ABI 的结构布局规则中, afters1::c
与 after 一样,有 3 个字节的填充。s2::c1
(以及大多数正常的 ABI。)
结构的总大小必须是它的倍数才能alignof()
使数组工作:连续内存中的结构,每个结构都占用sizeof(struct s1)
,而且每个结构的开始都对齐,以便int
成员对齐。
看看这两种类型的sizeof()
andalignof()
以及 int 与 char 的区别。根据 ISO C 定义的 sizeof(char) = 1,在 i386 SysV 中,sizeof(int) = alignof(int) = 4。
如果你有,那么struct { char foo[8]; char c; };
它的总大小只有 9 个字节,因为 alignof(char) = 1。
推荐阅读
- javascript - Puppeteer Promise Rejection (Query Selector If Class)
- ios - 在 swift 类中扩展通用目标 c 类
- r - 如何永久删除所有 NA?
- javascript - html 中粗体显示今天的营业时间
- ios - iOS 自定义键盘底座?
- python - 使固定时间步长 LSTM Keras 模型自由时间步长
- arrays - 如何使用包含数组名称的第二个变量引用现有的 bash 数组?
- c - 1 << 31不能用'int'类型表示?
- sql - 如何开始创建数据库?
- websocket - 我可以选择通过 Phoenix Presence 跟踪的特定进程/套接字吗?