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 里跑起来
- 用 VS Code 打开
cpp_learning文件夹 Cmd+Shift+P→ 输入CMake: Configure→ 选择 clang 编译器- 底部状态栏会变化,点击 Build 按钮(或 F7)编译
- 点 Launch 按钮(或 F5)运行并调试
你会看到输出:
矩阵维度: 512x512 * 512x512
平均时间: XX ms
C[0][0] = 1024 (期望值: 1024)
更重要的是:拿这个代码做实验
这个矩阵乘小程序就是你后续深入推理优化的起点:
- 把
M/N/K改成不同大小,观察时间变化。理解计算密度和缓存命中的关系 - 把
K循环移成最内层,性能为什么变差?这就是内存访问模式对性能的影响 - 之后学了 SIMD,回来在这里加上
__m256和_mm256_fmadd_ps,你会看到几倍的速度提升,这就是推理优化最核心的手动 SIMD 算子加速
下一步
等你这个例子跑通,下一阶段就可以:
- 把这个矩阵乘拆成
matmul.h+matmul.cpp+main.cpp,熟悉多文件编译 - 引入 Google Benchmark 库来做更专业的性能测试
- 用 CMake 的
FetchContent命令自动下载依赖(就像 Python 的pip install)
这个工作流一旦建立,你就从 Python 用户变成了 C++ 性能开发者。之后再去看 NCNN 源码、用 SIMD 写算子,都只是在这个基础上增加新知识。
有任何一步卡住了(编译报错、调试器连不上、CMake 配置失败),告诉我具体的错误信息,我帮你排查。
评论
请登录后发表评论
暂无评论,快来发表第一条评论吧!