macOS 上用 VS Code,不要碰 Xcode 写 C++。

Xcode 是个强大的 IDE,但它太重了,而且为 Swift/ObjC 深度定制。你用它写 C++,光是配置头文件路径、理解它的 Build Settings 界面,就能花掉你半天时间,学到的还不是通用的 CMake 知识。

VS Code 才是 C++ 跨平台开发的事实标准轻量编辑器。

macOS 上的 VS Code 配置清单

按这个清单来,一次性配好你的学习环境:

1. 安装命令行工具
打开终端,运行:

xcode-select --install

这会装上 clang++ 编译器和其他基础工具。clang++ 是 macOS 默认的 C++ 编译器,用法和 g++ 几乎一样。

2. 安装 VS Code 核心插件
- C/C++ (Microsoft) — 语法高亮、智能提示、代码跳转
- CMake Tools (Microsoft) — 让你在 VS Code 里直接 configure、build、debug
- CodeLLDB (Vadim Chugunov) — 把调试器接上,比 mac 自带的 lldb 更好用

这三个装完,你的 VS Code 就变成 C++ IDE 了。

3. 安装 CMake

brew install cmake

你以后所有项目的编译,都通过 CMake 来完成。忘掉 Xcode 项目文件,忘掉手动敲 g++ ...

你的第一个 CMake 项目

我帮你写一个能直接跑的例子,专门契合你学推理优化的路径——实现一个基础的矩阵乘,分别用普通循环和双重循环展开,输出性能对比

项目结构:

cpp_learning/
├── CMakeLists.txt
└── main.cpp

CMakeLists.txt 内容:

cmake_minimum_required(VERSION 3.16)
project(MatMulBench CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 先不要纠结这行是干嘛的,后面优化 SIMD 时会回来改
# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native -O3")

add_executable(matmul main.cpp)

main.cpp 内容(直接复制,重点是能跑能改):

#include <iostream>
#include <vector>
#include <chrono>

// 朴素矩阵乘:经典三层循环 i-k-j
void matmul_naive(const std::vector<float>& A,
                  const std::vector<float>& B,
                  std::vector<float>& C,
                  int M, int N, int K) {
    for (int i = 0; i < M; i++) {
        for (int k = 0; k < K; k++) {
            float a_ik = A[i * K + k];
            for (int j = 0; j < N; j++) {
                C[i * N + j] += a_ik * B[k * N + j];
            }
        }
    }
}

// 用来计时的辅助函数
double benchmark(void (*matmul_fn)(const std::vector<float>&, const std::vector<float>&, std::vector<float>&, int, int, int),
                 const std::vector<float>& A,
                 const std::vector<float>& B,
                 std::vector<float>& C,
                 int M, int N, int K,
                 int iterations) {
    auto start = std::chrono::high_resolution_clock::now();
    for (int i = 0; i < iterations; i++) {
        std::fill(C.begin(), C.end(), 0.0f);  // 每次迭代前清空结果
        matmul_fn(A, B, C, M, N, K);
    }
    auto end = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double, std::milli> ms = end - start;
    return ms.count() / iterations;
}

int main() {
    // 矩阵维度: A(M,K) * B(K,N) = C(M,N)
    const int M = 512, N = 512, K = 512;

    // 用 vector 管理内存(像 Python 的 list,但类型固定)
    std::vector<float> A(M * K, 1.0f);
    std::vector<float> B(K * N, 2.0f);
    std::vector<float> C(M * N, 0.0f);

    double avg_time = benchmark(matmul_naive, A, B, C, M, N, K, 5);

    std::cout << "矩阵维度: " << M << "x" << K << " * " << K << "x" << N << "\n";
    std::cout << "平均时间: " << avg_time << " ms\n";

    // 验证结果正确性(前几个元素应该是 K * 2.0)
    std::cout << "C[0][0] = " << C[0] << " (期望值: " << K * 2.0f << ")\n";

    return 0;
}

在 VS Code 里跑起来

  1. 用 VS Code 打开 cpp_learning 文件夹
  2. Cmd+Shift+P → 输入 CMake: Configure → 选择 clang 编译器
  3. 底部状态栏会变化,点击 Build 按钮(或 F7)编译
  4. Launch 按钮(或 F5)运行并调试

你会看到输出:

矩阵维度: 512x512 * 512x512
平均时间: XX ms
C[0][0] = 1024 (期望值: 1024)

更重要的是:拿这个代码做实验

这个矩阵乘小程序就是你后续深入推理优化的起点:

  • M/N/K 改成不同大小,观察时间变化。理解计算密度缓存命中的关系
  • K 循环移成最内层,性能为什么变差?这就是内存访问模式对性能的影响
  • 之后学了 SIMD,回来在这里加上 __m256_mm256_fmadd_ps,你会看到几倍的速度提升,这就是推理优化最核心的手动 SIMD 算子加速

下一步

等你这个例子跑通,下一阶段就可以:

  1. 把这个矩阵乘拆成 matmul.h + matmul.cpp + main.cpp,熟悉多文件编译
  2. 引入 Google Benchmark 库来做更专业的性能测试
  3. 用 CMake 的 FetchContent 命令自动下载依赖(就像 Python 的 pip install

这个工作流一旦建立,你就从 Python 用户变成了 C++ 性能开发者。之后再去看 NCNN 源码、用 SIMD 写算子,都只是在这个基础上增加新知识。

有任何一步卡住了(编译报错、调试器连不上、CMake 配置失败),告诉我具体的错误信息,我帮你排查。