败犬日报 2025-02-24
1. 想找系统工程方面的论文,重点是对 C++ 服务运行态下的分析和建模
看 johny's sw lib。
2. 一个 ODR 违背案例
cpp
static int internal_var = 10;
inline void counter() {
int x = internal_var;
printf("format: %d\n", x);
}
假设这个代码写在头文件里被多个源文件包含,导致 inline 函数读取不同的静态变量,就会在不同的 TU(翻译单元)里生成不同代码。这显然是 ODR 违背。
3. language server 针对 if constexpr 的补全
cpp
template <typename T>
constexpr void foo(T v) {
if constexpr (std::is_same_v<T, A>) {
v...
}
}
希望在 if constexpr 里可以针对 A 类型进行补全。
只能求解一些简单的 case 而且只能对标准库的 is_same_v 此类的 trait 进行识别从而进行特殊处理。用户如果写了 || && 等其他逻辑就会有大量 case。所以就没有实现。
workaround 的做法是使用一个引用来提示,但是很冗余。
cpp
template <typename T>
constexpr void foo(T v) {
if constexpr (std::is_same_v<T, A>) {
A &var = v;
...
}
}
4. explicit 构造和初始化列表的二义性
cpp
struct String1 {
explicit String1(const char*);
};
struct String2 {
String2(const char*);
};
void f(String1);
void f(String2);
int main() {
f({"asdf"}); // error, ambiguous
}
clang 能编译,但是代码不良构,这是 clang 的 bug。https://github.com/llvm/llvm-project/issues/28016
5. 模板类要不要分离 .h 和 .cpp
大多数情况不要。
分离的话需要显式实例化。
6. mold
是链接器,链接速度快。
开发可以用 mold,production 不要用 mold。
7. 链接相关的学习资料
《程序员的自我修养》
https://www.airs.com/blog/archives/38(gold 作者写的)