摸鱼精选第 5 期

1. 「现代 C++设计魅力」虚函数继承-thunk 技术初探

作者工作中使用 LLDB 调试器调试这一段 C++多继承程序的时候,发现通过 lldb print(expression 命令的别名) 命令获取的指针地址和实际理解的 C++的内存模型的地址不一样。然后通过 lldb 一步步分析汇编代码,验证了在指针类型转换的时候,编译器内部做了真实的地址偏移。

通过分析,我们得知编译器在函数调用时通过 thunk 技术动态调整入参 this 指针和返回值 this 指针,保证 C++调用时 this 的正确性;

在通过 LLDB expression 获取非虚函数基类指针内容时,LLDB 内部通过 summary format 进行格式化转换,格式化转化时会进行动态类型的获取。

2. C++智能指针-使用、避坑和实现

本文主要介绍以下内容:

  1. 智能指针的由来
  2. auto_ptr 为什么被废弃
  3. unique_ptr 的使用、特点以及实现
  4. shared_ptr 的使用、特点以及实现
  5. weak_ptr 的使用、特点以及实现
  6. 介绍作者在工作中遇到的一些职能指针相关的坑,并给出一些建议

3. 探索移动端音视频与 GSYVideoPlayer 之旅

作者从基础知识开始介绍封装、音频编码、视频编码,视频流 M3U8 和 RTSP。

接着重点介绍了作者开发的 GSYVideoPlayer,以及比较了 IJKPlayer、MediaPlayer 和 ExoPlayer 的区别。

最后列出了一些音视频开发中的常见问题。

4. 2021 年 Rust 生态调研报告 | 星辰大海 上篇 下篇

长篇巨著,分析了 Rust 当前的生态,前景,应用,以及未来。

5. 腾讯自主研发动画组件 PAG 开源

官网网站:https://pag.io/ github 地址:https://github.com/Tencent/libpag

Lottie 的替代品,移动端、web 端、桌面端等全平台支持,尤其是在 web 端使用 webassembly,性能更好。

6. 新一代消息队列 Pulsar

Apache Pulsar 是 Apache 软件基金会顶级项目,是下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体,采用计算与存储分离架构设计,支持多租户、持久化存储、多机房跨区域数据复制,具有强一致性、高吞吐、低延时及高可扩展性等流数据存储特性,被看作是云原生时代实时消息流传输、存储和计算最佳解决方案

Apache 的又一个 pub-sub 模型的消息队列的开源项目。本文对 Pulsar 的特性、机制、原理等进行整理总结。

7. 贝壳 B 端 iOS 包瘦身之路

作者从以下几个方面来优化包大小:

  1. 二进制优化
  2. 编译优化:
    1. 编译选项优化:- Link-Time Optimization: Incremental
    2. 编译指令优化:-Wl,-rename_section,TEXT,cstring,RODATA,cstring
  3. 无用/重复技术栈下线
  4. 无用的代码下线
  5. 重复代码下线
  6. 代码内部优化
  7. 资源优化
  8. 启动图使用 storyboard
  9. 无用图片删除,有工具 LSUnusedResources查找
  10. Assets 管理图⽚
  11. 资源压缩,比如大图转成 webp,图片用 iconFont,或者用 ImageOptim 和 tinypng,通常可以循环压缩
  12. 最重要的是图片放云端

8. Redis 线程模型的前世今生

作者是 vivo 互联网服务器团队,下面是文章概述:

我们从 IO 的起源开始,讲述了阻塞 IO、非阻塞 IO、多路复用 IO。基于多路复用 IO,我们也梳理了几种不同的 Reactor 模型,并分析了几种 Reactor 模型的优缺点。基于 Reactor 模型我们开始了 Redis 的 IO 模型和线程模型的分析,并总结出 Redis 线程模型的优点、缺点,以及后续的 Redis 多线程模型方案。本文的重点是对 Redis 线程模型设计思想的梳理,捋顺了设计思想,就是一通百通的事了。

9. Flutter 疑难杂症系列:实现支持复杂需求的列表

作者是字节跳动终端技术团队的。

本文主要介绍了列表 Sliver 组件中的一些优化点及其大致实现原理,涉及到性能以及功能两个方面,列表场景中的另一个长期问题则是复杂场景下 NestedScrollView 中嵌套列表,手势传递,嵌套滑动、刷新等需求的实现,后续则会继续尝试治理这类问题,尝试输出通用方案。

10. 微信终端自研 C++协程框架设计与实现 1 2

非常值得深度研读的文章,对 C++ 协程 说的很深入。

虽然 C++ 20 新增了协程功能,但你的编译器未必有这么新,所以想要体验协程的魅力可以考虑这个思路。

11. Flutter 流畅度优化实践总结

作者是在阿里巴巴闲鱼技术部,目前负责闲鱼 app 包大小、流畅度、启动等端体验内容。本篇内容来自 ArchSummit 会议分享,围绕 flutter 流畅度,分别讲述:

  1. Flutter 流畅度优化挑战;
  2. 列表容器和 FlutterDx 组件优化;
  3. 性能衡量和 devtool 扩展;
  4. Flutter 滑动曲线优化;
  5. 性能优化建议。

12. 【性能优化】高效内存池的设计与实现

姐妹篇:30 张图带你领略 glibc 内存管理精髓

深入理解 glibc malloc:内存分配器实现原理

13. 消息队列背后的设计思想

作者是腾讯 PCG 后台开发工程师,本文主要解决三个问题:

  1. 消息队列适合什么场景?
  2. 消息队列有哪些主流产品、各自的优缺点?
  3. 消息队列背后的设计思想(整体核心模型、数据存储考量、数据获取方案对比、消费者消费模型)

14. 分布式消息队列

作者是腾讯 IEG 后台开发工程师,内容和上一篇差不多,可以对比着看。

15. 深入理解一致性与 C++ 内存模型

作者是字节跳动技术团队的。

本文旨在对计算机科学下的一致性模型以及 C++ 的内存模型做一个系统的、深入浅出的介绍。一共 3 个 章节:第 1 章介绍一致性模型,第 2 章介绍 C++ 内存模型,第 3 章是参考资料。