关于stack_logging_type代码监控逻辑及OOMDetector分支判断的问询
关于
stack_logging_type相关位标志的疑问解答 1. stack_logging_type_dealloc|stack_logging_type_alloc监控的内容
首先,stack_logging_type_alloc和stack_logging_type_dealloc是位标志常量,各自对应内存操作中的一种事件:
stack_logging_type_alloc:代表内存分配(allocation)事件stack_logging_type_dealloc:代表内存释放(deallocation)事件
用按位或|组合这两个常量后,得到的值是把两个标志位同时置1的结果,它代表同时涵盖内存分配和释放两种事件类型。
2. type == (stack_logging_type_dealloc|stack_logging_type_alloc)的作用
这个条件并不是判断type是否包含alloc或dealloc事件(那应该用type & flag != 0),而是判断type的值恰好等于这两个标志的组合——也就是说,只有当type同时设置了alloc和dealloc的位,且没有其他额外的位被设置时,该条件才成立。
这种场景通常出现在:
- 系统层面的某些回调会传递复合事件类型,比如一次性通知分配+释放的批量操作
- 自定义的事件类型标记,用来表示需要同时处理两种操作的逻辑
3. 腾讯OOMDetector分支逻辑的合理性
来看这段代码的顺序:
if (type == (stack_logging_type_dealloc|stack_logging_type_alloc)) { } else if (type == stack_logging_type_dealloc) { } else if((type & stack_logging_type_alloc) != 0){ }
这样的分支顺序是为了精准区分不同的事件场景,避免逻辑覆盖:
- 第一个分支:优先处理同时触发alloc和dealloc的复合场景——这类场景需要单独的处理逻辑,不能和纯alloc/纯dealloc混淆。
- 第二个分支:处理纯粹的释放事件(只有dealloc位被设置),确保这类事件不会被后面的alloc判断分支捕获。
- 第三个分支:处理所有剩余的包含alloc的事件——包括纯alloc事件,或者alloc与其他未定义位组合的事件。
如果调换顺序(比如先判断type & alloc !=0),那么复合事件会被直接捕获到第三个分支,丢失了专门处理复合场景的机会,这就是为什么要先判断复合值,再单独判断dealloc,最后处理alloc相关事件。
内容的提问来源于stack exchange,提问作者ZhanKail
相关产品推荐
相关产品推荐

