一周杂记 in Week 4 Feb 2026
本周(02/23 ~ 03/01)是2月份第四周,周日已经是3/1,春节假期也结束了,又回到了打工牛马的状态。
Life
#1
这周开始23号正月初七已经是最后一个官方休息日了,我自己24号又请年假多休息了一天,方便找找状态 🤡
于是周三25号正式开始上班,结果第一天就累到人要 burn out;一想到周六还要调休上班,我内心想领礼包提前退休的冲动又起来了
不过还好周六是 WFH 的,所以不用看到老崔;不过还是被特么强行安排了一个会,所以还是很不爽
#2
周四下了一天雨,晚上蹭了老婆医院的药代请的城中香格里拉酒店的自助餐。
自助餐味道确实不错,不过因为我到的比较晚,就吃了二十来分钟就和我媳妇儿一起去听课了 🤣
听了一个 session 大概弄明白了 医药公司 – 邀请专家演讲 – 参会医院医生 这个利益链条了
不过听完一个 session 就跟媳妇儿一起回家了 🤡
#3
周五晚上请了几个同事吃饭,给 suyang 接风洗尘,也欢送 kidd 第二天就去美国出差。
地方是suyang推荐的台州菜,味道还不错,不过海鲜上感觉处理的一般,比老邻舍差不少。
下回我直接请老邻舍的海鲜好了,让 xdm 体验一下正宗温州海鲜
#4
周日把书房的地毯给换了,这地毯估计用了3-4年了确实该换了。
不过换完之后有点太毛绒绒了有点不太习惯。
下午和 Hogan 冒着雨上了一次拳击课,因为是这一次买的课程的最后一节,所以打了2个半小时,打完直接累到不行。
不过后面会和 Hogan 继续续课,毕竟还是爽的
Work
#1
Asynchronous Programming with C++ | 8. Asynchronous Programming using Coroutines
- 手写入门级别的 coroutine classes
- 没啥新意,随便翻翻就行
CppCon 2023 | std::simd: How to Express Inherent Parallelism Efficiently Via Data-parallel Types - Matthias Kretz https://www.youtube.com/watch?v=LAJ_hywLtMA&list=PLHTh1InhhwT7gQEuYznhhvAYTel0qzl72&index=27
- 介绍 C++ 26 的 simd;一个 simd
是一个 w-维的向量数据(其实就是对应 simd指令操作数)以及相关的一些操作函数生态 - 但是 simd
不是简单的 simd instructions wrapper,设计上是希望和标准库算法这些做结合
CppCon 2023 | Plenary: Coping With Other People’s C++ Code - Laura Savino https://www.youtube.com/watch?v=qyz6sOVON68&list=PLHTh1InhhwT7gQEuYznhhvAYTel0qzl72&index=26
- 不是纯技术向的 talk,主要围绕的是在组织内的 social/cooperation 这些;但是我觉得这个反而是一个很好的 talk,因为在公司内更多的问题都不是技术问题
CppCon 2023 | Back to Basics: Debugging in Cpp - Greg Law https://www.youtube.com/watch?v=qgszy9GquRs&list=PLHTh1InhhwT7gQEuYznhhvAYTel0qzl72&index=28
- 作为 back to basics 系列的话质量非常高,介绍 gdb/lldb,不过作者作为一个老江湖一些相对少用的 gdb commands 也是容易弄错,作者自己也用 gdb-dashboard
- valgrind + sanitizer
- strace/ptrace/ltrace
- 最后演示了一把 gdb 的 time-travel
C++ Weekly - Ep 189 - C++14’s Variable Templates https://www.youtube.com/watch?v=2kY-go52rNw
之前几乎只用来做 type traits 的 value,但是这视频才发现还可以利用特化来做编译期计算…
1
2
3
4
5
6
7
8
9
10template<int Value>
constexpr int fib = fib<Value-1> + fib<Value-2>;
template<>
constexpr int fib<1> = 1;
template<>
constexpr int fib<2> = 1;
static_assert(fib<10> == 55);
C++ Weekly - Ep 188 - C++20’s constexpr new Support https://www.youtube.com/watch?v=FRTmkDiW5MM
- constexpr function 中可以用 new operator 了,但是scope里分配的资源必须要用 operator delete 回收之后才能退出
- 所以目前是由各种开脑洞的利用,比如利用 std::array 来回倒腾接收最终结果
C++ Weekly - Ep 187 - C++20’s constexpr Algorithms https://www.youtube.com/watch?v=9YWzXSr2onY
- 目前标准库的算法有相当一部分支持了 constexpr,甚至已经可以编译期对 std::array 做排序了
- 不过也有一些,比如 std::sample / std::accumulate 还没有被 constexpr-ize
C++ Weekly - Ep 186 - What Are Callables? https://www.youtube.com/watch?v=lWzHLRN56zQ
- 对于任意 callable,甚至是 member fun,用 std::invoke 解千愁
How do exceptions work in C++ on Linux? https://pvs-studio.com/en/blog/posts/cpp/1333/
- 针对的是 Linux Itanium(X64) ABI 下 Clang 对于 C++ 异常的支持机制;通过 LLVM 代码 + Godbolt 反汇编的研究
- 抛出 (Throw):
throw语句会被翻译为__cxa_allocate_exception(在堆上为异常对象及__cxa_exception头部元数据分配内存),随后调用__cxa_throw初始化上下文并触发底层的栈展开。 - 捕获 (Catch):
catch块会被包裹在__cxa_begin_catch(接管异常,更新状态)与__cxa_end_catch(执行完毕后调用析构并释放异常内存)之间。如果是继续抛出 (throw;),则会调用__cxa_rethrow。 - 两阶段的栈展开(Two-phase Stack Unwinding):底层
_Unwind_RaiseException会执行严格的两阶段动作- 阶段一 (Search Phase / 查找阶段):读取编译器预先埋在可执行文件中的元数据表(Exception Handling Tables),结合 Personality Routine(如
__gxx_personality_v0),顺着栈帧向上回溯,寻找能够处理该异常类型的catch块。 - 阶段二 (Cleanup Phase / 清理阶段):确定目标后,执行第二次栈回溯。在此过程中逐个清理沿途的栈帧,严格调用局部对象的析构函数以保证 RAII,最终强行将指令指针(控制流)跳转到目标
catch代码块中。
- 阶段一 (Search Phase / 查找阶段):读取编译器预先埋在可执行文件中的元数据表(Exception Handling Tables),结合 Personality Routine(如
C++ Weekly - Ep 185 - Stop Using reinterpret_cast! https://www.youtube.com/watch?v=L06nbZXD2D0
- reinterpret_cast 会导致 UB
- 给了一种场景的解法:trivial types 通过 memcpy 来处理,编译器优化之后生成的汇编是一样的
#2
春节期间想了想,还是给 fawkes 加上了 request body limit 的选项,不过不知道后面 by default 1MB request body 这个行为是不是要调整
Commit:https://github.com/kingsamchen/fawkes/commit/7b6e3dc4c2e51936b1976412a0101b888f3448bf
#3
之前加完对 expect 100 的支持之后发现 wrk 压测下来的性能衰退了5%多,单请求延迟增加了十几us。
研究了一下猜测是把完整的 async_read 拆成了 async_read for header 和 async_read for body 之后多一次处理带来的。
考虑到 idle read (最多能读入 512 bytes)本身可能已经读入了完整的 header,所以其实可以先检查一下 parser 是否 header done 再继续的
改了之后跑了相同的 wrk bench,发现性能比拆分前还要好5%多 🤡
想了一下因为 data 都有了,不会再触发 syscall read,所以这里大头开销还是多了几次 asio scheduler,parser 检查之后小数据量下都给直接优化掉了
Commit:https://github.com/kingsamchen/fawkes/commit/e423ca2b9a9e77135dbf85c7149cc5d05d014c21
#4
很早之前就对 byobu 窗口分割之后每个 panel 获取焦点后会加粗边框不爽,但是一直拖着没弄。
这次索性直接问了 Gemini Pro 老师,G老师不仅给我科普了整个是 tmux 的行为,还教了我解决方案
1 | ~/.byobu/.tmux.conf |
试了一下果然舒服多了