c - C 编程中的 pragmapack() 除了结构包装还有其他用途吗?
问题描述
当我在接受采访时,面试官问我除了结构包装之外,C 语言中还有其他用法吗?所以我回答说除了结构包装我不知道。那么它还有其他用途吗?
解决方案
#pragma pack(size)
是用于更改结构填充方案的预处理器指令。通常一个结构会在其成员之间添加填充字节以加速内存获取操作。它使用的填充字节数取决于机器架构。例如,
struct sample {
int a;
char b;
int c;
};
当我们看到上面的结构时,它只需要 9 个字节(4 + 1 + 4)来保存成员 a、b 和 c,但是对于 32 位架构,这个结构的变量需要 16 个字节(4 + 4 + 4)记忆。即使 char b 只需要 1 个字节,它也需要 4 个字节 1 来存储 b 的值,其他三个作为填充字节。
padding_size = (word_size of machine architecture > highest sized structure member datatype's size) ? highest sized structure member datatype's size : word_size of machine architecture;
我们可以使用预处理器指令强制分配填充大小#pragma pack(size)
,size
应该是机器架构的 word_size 的 2 次方。
如果我们使用喜欢
#pragma pack(1)
对于上述结构,保存类型变量所需的内存总量struct sample
将为 (4 + 1 + 4) 9 个字节。
推荐阅读
- python - 条件不满足时如何跳过任务
- c# - 填充 BatchBlock 和调用下一个 ActionBlock 之间的延迟
- codeigniter - 为什么codeigniters raw_input_stream 为空?
- c# - 当命名空间不明确时使用特定的类
- mysql - 需要添加 DISTINCT 才能加入
- php - 如何在 Laravel 的一个 html 表中运行两个 foreach 循环?
- sql - 使用子查询设置列值
- angular - 如何检测用户是否从 iframe 提交了表单
- reactjs - 反应路由器重定向未按预期工作
- sql - 仅当字段存在时才选择字段(SQL 或 Scala)