Tags

21 个页面

c++

让 AI 写 Demo,检查点要比代码更小

AI 写 C++ 小项目,最吓人的地方不是它写不出来,而是它太快写出来了。

你只是想起一个最小 Demo,它三分钟给你铺好目录,接好三方库,补上日志、配置、异常和几个看起来很专业的类。项目甚至能跑。问题是,等你开始认真接业务,才发现自己还没搞清楚新库支持什么、构建链路怎么走、哪些抽象是必要的,返工已经排着队来了。

我现在对 AI 编程的态度反而更保守:不是少用 AI,而是每一轮都把检查点压小。尤其 C++ 这种没有统一脚手架兜底的语言,前面让 AI 多做一点,后面就可能多还几步。

VS Code 调 C++,CMake 和 GDB Printer 要一起配

以前我在 VS Code 里调 C++,配置基本就停在 launch.json,最多再加一句 GDB。

program 填好,把 gdb 填好,把断点打好。然后呢?然后每次调试前,自己去终端里 cmake --build 一下。

更烦的是,自定义的价格、合约、订单类型断下来以后,VS Code 调试窗口经常只能看到一堆内部字段。数据是对的,但是不说人话。

这事离谱的地方在于,我以前看过的一些教程也差不多就写到 launch.json 为止。直到最近让 AI 配一个新项目,它顺手加了 preLaunchTaskgdb_printers.py,我才反应过来:VS Code 调 C++,不只是把 GDB 启起来。调试前可以自动触发 CMake 编译,断点停住以后,也可以让 GDB 加载 Python 脚本,把业务类型处理成自己看得懂的样子。

说实话,这不是什么黑科技。

但是它刚好补上了 C++ 日常调试里两块很烦的空白:启动前构建,以及断点后的变量展示

文件夹分层再套 namespace,这事到底叫什么

最近写算法服务,twapvwap 这类模块一铺开,我又把这个老问题翻出来了。

C++ 里如果还靠类名硬扛语义,名字很快就会失控。TwapOrderManagerVwapOrderManagerAlgoOrderManager 这种东西,写着写着就一股子“我知道自己结构没收住,但我先把前缀补上”的味道。说白了,按文件夹分层,再配一层 namespace,不是代码洁癖,这是在补 C++ 没有 Java 那种原生 package 体系的空位。

unordered_map 查得到却取错值,一次静态 lambda 的内存事故

有一种 C++ 问题特别容易把人带偏:unordered_map::find 明明命中了,it->first 也对,可你再看 it->second 里面的字段,像是变成了另一个 key 的数据。

第一反应通常是怀疑 map 坏了,或者 hash 冲突把数据弄乱了。可 unordered_map 没那么玄。查找命中以后,key 和 value 对不上,更常见的原因不是容器失灵,而是你在更新 value 的时候已经写错了地方。

这篇记录的坑,就是函数内部的 static lambda 捕获了局部引用。第一轮看不出来,后面再调用时,lambda 还握着第一次调用留下的引用,问题就开始变得像“缓存串号”。

跨机器计算时间差

组内现有通讯协议使用 steady_clock 作为时间戳,计算单个节点的耗时,某个特殊场景,用到了消息包自带的时间戳,自带的时间戳来自于其他机器,导致计算出来的耗时异常。

题话外:Gemini2.5 Pro 有希望彻底超越 GPT-4

内存布局和二进制兼容性

C++ Linux 服务发生崩溃。服务依赖于某个静态库进行编译。

静态库执行了修改,头文件增加了成员变量,重新发布了静态的二进制库文件

服务依赖新的二进制库文件,能正常编译,运行就会崩溃,崩溃的地方明显没问题,有点类似上次编译器升级的崩溃,未定义行为,崩溃的堆栈不可信。 更新服务编译时依赖的头文件,能正常变异,运行也都正常

详细解释这是为什么,涉及到什么计算机的知识,我猜测和内存布局相关,举例进行详细说明。