Skip to content

败犬日报 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. 链接相关的学习资料

linkers and loaders

《程序员的自我修养》

https://www.airs.com/blog/archives/38(gold 作者写的)