当前位置: 首页 > java >正文

cJSON中#define cJSON_IsReference 256 和 #define cJSON_StringIsConst 512这定义的大小是?

在 cJSON 中,#define cJSON_IsReference 256 和 #define cJSON_StringIsConst 512 是位掩码(bitmask),它们的值(256 和 512)是精心选择的,目的是在 cJSON 结构体的 type 字段中进行按位操作,以标记不同的对象属性。


1. 为什么是 256 和 512?

这两个值是 2 的幂,对应二进制表示中的单个位

  • 256 = 0x100 = 0000 0001 0000 0000(第 9 位为 1,其余为 0)

  • 512 = 0x200 = 0000 0010 0000 0000(第 10 位为 1,其余为 0)

这样设计是为了:

  1. 避免冲突type 字段的低 8 位(0-7)用于存储 JSON 数据类型(如 cJSON_NumbercJSON_String 等),而高位(8-15)用于存储额外标志。

  2. 支持位运算:可以通过 |(或)设置标志,&(与)检查标志,~(非)清除标志。


2. type 字段的结构

cJSON 结构体的 type 字段是一个 int,其布局如下:

| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| Reserved       | StringIsConst | IsReference | JSON 数据类型(如 String、Number) |
  • 低 8 位(0-7):存储 JSON 数据类型(如 cJSON_String = 4cJSON_Number = 8)。

  • 高位(8-15):存储额外标志,如 IsReference(第 9 位)和 StringIsConst(第 10 位)。


3. 如何设置和检查这些标志?

cJSON 提供了宏来操作这些标志:

// 设置标志
#define cJSON_SetFlag(object, flag) ((object)->type |= (flag))
#define cJSON_UnsetFlag(object, flag) ((object)->type &= ~(flag))// 检查标志
#define cJSON_IsReference(object) ((object) && ((object)->type & cJSON_IsReference))
#define cJSON_StringIsConst(object) ((object) && ((object)->type & cJSON_StringIsConst))

示例

cJSON *obj = cJSON_CreateString("Hello");
cJSON_SetFlag(obj, cJSON_StringIsConst); // 标记为常量字符串if (cJSON_StringIsConst(obj)) {printf("该字符串是常量,不会被 cJSON_Delete 释放\n");
}

4. 为什么不用 enum 或 bool

  • 性能优化:位运算比 bool 或 enum 更高效,尤其是在频繁操作 JSON 树时。

  • 内存节省type 字段只需要 16 位(int),而如果用多个 bool 变量会占用更多内存。

  • 兼容性:cJSON 设计为轻量级,适用于嵌入式系统,位操作是最优选择。


5. 总结

十进制值十六进制二进制(位位置)用途
cJSON_IsReference2560x1000000 0001 0000 0000(第 9 位)标记对象是引用(共享数据)
cJSON_StringIsConst5120x2000000 0010 0000 0000(第 10 位)标记字符串是常量(不应释放)

这两个宏的值(256 和 512)是按位设计的,确保它们不会与 JSON 数据类型(低 8 位)冲突,并能高效地进行标志管理。

http://www.xdnf.cn/news/1976.html

相关文章:

  • CSS常见布局
  • 逐行解析性能奥秘:借助 `line_profiler` 深入优化热点函数
  • MySQL 从入门到精通:第二篇 - 数据类型、约束与索引
  • 【华为HCIP | 华为数通工程师】821—多选解析—第十六页
  • 那些年踩过的坑之Arrays.asList
  • CC攻击的类型都有哪些?
  • eclipse怎么导入junit4
  • 解读《数据资产质量评估实施规则》:企业数据资产认证落地的关键指南
  • MCP(Model Context Protocol)
  • AlarmClock4.8.4(官方版)桌面时钟工具软件下载安装教程
  • Zephyr kernel Build System (CMake)介绍
  • MySQL引擎分类与选择、SQL更新底层实现、分库分表、读写分离、主从复制 - 面试实战
  • 数字浪潮下的算力担当:GPU 服务器的多元应用、核心价值
  • 技术探索之路:从自我认知到成长规划
  • 实现层归一化
  • 数据结构------C语言经典题目(7)
  • 【T-MRMSM】文本引导多层次交互多尺度空间记忆融合多模态情感分析
  • 基于cesium实现鼠标移动动态绘制矩形和圆
  • Rust 学习笔记:函数和控制流
  • React 中什么时候用事件总线
  • 微信小程序直传阿里云 OSS 实践指南(V4 签名 · 秒传支持 · 高性能封装)
  • ROS1、ROS2如何把预编译好的二进制文件封装成功能包?
  • 【Django】新增字段后兼容旧接口 This field is required
  • 代码随想录:数组
  • 如何实现Android屏幕和音频采集并启动RTSP服务?
  • 如何使用@KafkaListener实现从nacos中动态获取监听的topic
  • 【Hive入门】Hive数据导出完全指南:从HDFS到本地文件系统的专业实践
  • 利用JMeter代理服务器方式实现高效压测
  • Leetcode 2845 题解
  • C++_数据结构_详解红黑树