MENTAL MODEL / 心智模型
先建立正确的程序直觉
优先值语义与确定性析构:对象离开作用域时自动释放资源,裸指针通常只表达非拥有观察。
Mathematics · Computational Science · Engineering · Personal Knowledge Systems
切换会载入对应网站形态,并更换导航、首页结构、内容密度、页面网格与阅读路径;当前路径及其他查询参数会保留。
预览卡展示真实构图语言;切换后会同步改变布局密度、卡片几何、按钮、边框、HUD、背景纹样与动效节奏。
0% 会停止装饰动画并隐藏粒子;系统开启“减少动态效果”时始终优先静态显示。
0% 会移除上层面板遮罩,100% 为完全不透明;文字和控件始终保持清晰。
系统已启用减少透明效果:背景模糊会关闭,但仍采用你设置的面板不透明度。
LANG-02 · PROGRAMMING WORKBENCH
用 RAII、值语义和泛型算法构建高性能且边界清晰的软件。
从标准库容器与算法进入现代 C++,用 CMake、测试和 Sanitizer 把复杂性约束在可验证的工程边界内。
MENTAL MODEL / 心智模型
优先值语义与确定性析构:对象离开作用域时自动释放资源,裸指针通常只表达非拥有观察。
CODE REPOSITORY / 代码仓库锚点
cpp-project/
├─ CMakeLists.txt
├─ include/app/model.hpp
├─ src/main.cpp
├─ src/model.cpp
└─ tests/model_test.cppQUICK START / 第一条命令
c++ -std=c++20 -Wall -Wextra -Wpedantic -g src/main.cpp -o build/appLEARNING ROUTE / 学习路径
每个节点都包含可复制示例、判断原则与常见陷阱。
优先使用标准库抽象,让边界与所有权由类型表达。
std::vector<int> values{4, 1, 7, 1};
std::ranges::sort(values);
auto unique_end = std::ranges::unique(values).begin();
values.erase(unique_end, values.end());算法表达意图;删除重复项仍需配合容器 erase。
std::optional<User> find_user(std::string_view id);
if (auto user = find_user(input)) {
render(*user);
}用 optional 表达“可能没有值”,不要用魔法哨兵值。
std::ifstream input(path);
if (!input) {
throw std::runtime_error("cannot open input");
}
std::string line;
while (std::getline(input, line)) { process(line); }流对象析构时自动关闭文件;构造成功后资源与对象生命周期绑定。
减少头文件耦合,把编译选项和依赖绑定到明确 target。
#pragma once
#include <span>
namespace app {
double mean(std::span<const double> values);
}span 表达连续的非拥有视图,并携带长度;头文件只 include 契约所需内容。
cmake_minimum_required(VERSION 3.20)
project(model_lab LANGUAGES CXX)
add_library(model src/model.cpp)
target_include_directories(model PUBLIC include)
target_compile_features(model PUBLIC cxx_std_20)
add_executable(app src/main.cpp)
target_link_libraries(app PRIVATE model)PUBLIC/PRIVATE 描述依赖是否传播,避免 directory 级全局设置。
保持编译数据库、调试符号和可切换配置,让 IDE 与命令行使用同一事实来源。
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Debug -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
cmake --build build
ctest --test-dir build --output-on-failure单配置生成器使用 CMAKE_BUILD_TYPE;Visual Studio 等多配置生成器用 --config。
c++ -std=c++20 -Wall -Wextra -Wpedantic -Wconversion -g src/main.cpp -o build/app适合最小实验;正式工程将选项放到 CMake target。
c++ -std=c++20 -fsanitize=address,undefined -fno-omit-frame-pointer -g src/main.cpp -o build/app平台支持不同;MSVC 可使用其 AddressSanitizer 配置。
使用清单锁定依赖,优先链接导入 target,避免复制二进制与 include 路径。
{
"name": "model-lab",
"version-string": "0.1.0",
"dependencies": ["fmt", "catch2"]
}manifest 模式让依赖与工程一起版本化;baseline 用于锁定解析版本。
find_package(fmt CONFIG REQUIRED)
target_link_libraries(app PRIVATE fmt::fmt)不要手工拼接库文件路径;导入 target 会携带传递依赖与平台设置。
把崩溃复现成最小测试,再用调用栈、Sanitizer 和静态分析交叉定位。
#include <cassert>
int main() {
assert(mean(std::array{2.0, 4.0, 6.0}) == 4.0);
}快速实验可用 assert;持续集成更适合 Catch2、GoogleTest 等测试框架。
break main
run
bt
frame 0
print object先看线程与调用栈,再检查对象生命周期、容器状态和动态类型。
clang-tidy src/model.cpp -- -std=c++20 -Iinclude最好让 clang-tidy 读取 compile_commands.json,确保分析参数与真实构建一致。
先识别错误阶段,再从第一条真正错误向上追踪。
定位最早出现的 required from / constraints not satisfied;缩小模板实参,检查 concept、const 和引用限定。后续数十条通常是级联错误;不要从日志末尾开始读。
检查实现是否链接、命名空间/const/noexcept/模板签名是否一致,以及模板定义是否对实例化点可见。这是链接错误,不是 include 数量不足的同义词。
核对容器操作的失效规则;vector 扩容、erase 和 reallocation 后不要继续使用旧迭代器、指针或引用。优先保存索引或重新获取迭代器,并写覆盖边界的测试。
让类型表达所有权和范围,把裸 new/delete 与无界访问赶出业务代码。
auto model = std::make_unique<Model>(config);
run(*model);默认用 unique_ptr;只有确实共享生命周期时才考虑 shared_ptr。
double mean(std::span<const double> values) {
if (values.empty()) throw std::invalid_argument("empty input");
return std::reduce(values.begin(), values.end()) / values.size();
}span 携带长度但不拥有数据;调用者仍需保证底层对象存活。
共享可变状态最小化;用锁或消息传递建立同步;用 ThreadSanitizer 检查数据竞争;不要跨锁调用未知回调。volatile 不能替代原子或互斥同步。
尝试更短的关键词,或者清空分类后重新搜索。
PRIVATE CODE VAULT / 私人代码仓库
把 C++ 的练习、工程片段、算法伪代码、验证说明与历史版本保存在登录后的私人空间。
游客只看到这个说明,不会收到、缓存或渲染任何私人源码。
REFERENCE SOURCES / 官方与高质量资料
先在本站找回路径,再进入原始文档确认版本、平台和完整前置条件。
DELIVERY LOOP / 练习闭环