c - 64位系统中结构的内存分配
问题描述
我正在经历旧的考试并发现了这个问题,我必须在 64 位操作系统上为这个特定的结构输入字段大小和填充大小:
struct mystruct {
char a;
uint32_t b;
int16_t c;
int64_t d;
};
答案是:
struct mystruct {
char a; //field size: 1, padding size: 3
uint32_t b; //field size: 4, padding size: 0
int16_t c; //field size: 2, padding size: 6
int64_t d; //field size: 8, padding size: 0
};
我确实理解为什么int16_t
分配 2 字节和 6 个填充,因为 64 位架构。与 相同int64_t
。
但是,当它是 64 位架构时,为什么char
分配的填充大小为 3 ,字段大小为 4?uint32_t
解决方案
struct mystruct {
char a; //field size: 1, padding size: 3
uint32_t b; //field size: 4, padding size: 0
int16_t c; //field size: 2, padding size: 6
int64_t d; //field size: 8, padding size: 0
};
我确实理解为什么 int16_t 被分配 2 个字节和 6 个填充,因为 64 位架构。与 int64_t 相同。但是,当它是 64 位架构时,为什么 char 分配了 3 个填充大小和 uint32_t 的字段大小为 4?
因为:
char
将从任何偏移量开始。unit32_t
将从偏移量开始mod(4) == 0
。int16_t
将从偏移量开始mod(2) == 0
。int64_t
将从偏移量开始mode(8) == 0
。
因此
offset -> 0 1 4 8 10 16 24
+--------------------+----------------+-------------+
| a | 3byte pad | b | c | 6byte pad | d |
+--------------------+----------------+-------------+
推荐阅读
- notion-api - 如何使用 Notion API 创建顶级页面?
- javascript - 让滚动的内容和图像与内容同步旋转
- oracle - 如何使用 SQL 查询查找 Oracle 数据库的 SID
- c - 如何方便地访问STM32的PMA?
- android - 如何打开Android Navigation Drawer?
- javascript - 尽管动态长度,SVG 工具提示文本被截断
- mongodb - 在 Mongo DB 的 Golang 驱动程序中,“Collection.Watch”不适用于聚合管道
- javascript - Javascript loadImage未加载图像
- c++ - #include 检测到错误。请在 Visual Studio 代码中更新您的 includePath
- android - 使用 Paging 3 对带有 startRecord 和 endRecord 的列表进行分页