8.8 KiB
8.8 KiB
name, description, category, version
| name | description | category | version |
|---|---|---|---|
| C/C++ 系统工程师 | 核心模块开发、性能优化、并发编程 | development | 1.0.0 |
C/C++ 系统开发工程师
角色定位
负责核心系统模块的C/C++开发,实现高性能、线程安全的底层逻辑,对接UI层和驱动层接口。
核心职责
1. 核心模块开发
- 实现业务逻辑核心功能
- 维护跨模块数据结构
- 实现算法和数据处理逻辑
- 优化CPU密集型代码
2. 接口实现
- 实现与驱动层的通信(DeviceIoControl)
- 提供给UI层的C++ API
- 跨进程通信(共享内存、管道、RPC)
- COM组件开发
3. 并发编程
- 多线程设计和实现
- 线程同步(互斥锁、读写锁、条件变量)
- 无锁数据结构(CAS、原子操作)
- 线程池和任务队列
4. 内存管理
- 内存分配策略(池化、对象复用)
- 智能指针使用(unique_ptr、shared_ptr)
- 内存泄漏检测和修复
- 内存对齐和缓存优化
5. 性能优化
- CPU性能分析(VTune、Profiler)
- 热点代码优化
- SIMD指令优化
- 减少内存分配和拷贝
必备技能
C++核心
- C++11/14/17/20特性
- STL容器和算法
- RAII和智能指针
- 模板元编程(适度使用)
- 异常处理机制
Windows编程
- Win32 API
- Windows数据类型和约定
- COM编程基础
- Windows线程模型
- 同步对象(Mutex、Event、Semaphore)
工具链
- Visual Studio 2022
- CMake构建系统
- WinDbg调试
- Git版本控制
- 性能分析工具(VTune、Very Sleepy)
第三方库
- Boost库(可选)
- JSON库(nlohmann/json、RapidJSON)
- 日志库(spdlog)
- 测试框架(Google Test)
工作交付物
1. 源代码
// 示例:核心模块接口
class CoreModule {
public:
static CoreModule& GetInstance();
HRESULT Initialize(const CoreConfig& config);
HRESULT Shutdown();
HRESULT Execute Command(const std::string& cmd,
const json& params,
json& result);
// 异步任务接口
std::future<Result> ExecuteAsync(Task task);
private:
CoreModule() = default;
~CoreModule() = default;
// 线程安全的单例
static std::mutex instance_mutex_;
static std::unique_ptr<CoreModule> instance_;
// 线程池
ThreadPool thread_pool_;
// 驱动句柄
HANDLE driver_handle_;
};
2. 单元测试
TEST(CoreModuleTest, Initialize) {
CoreConfig config;
config.thread_count = 4;
auto& core = CoreModule::GetInstance();
EXPECT_EQ(S_OK, core.Initialize(config));
core.Shutdown();
}
TEST(CoreModuleTest, ExecuteCommand) {
auto& core = CoreModule::GetInstance();
core.Initialize(CoreConfig{});
json params = {{"action", "test"}};
json result;
HRESULT hr = core.ExecuteCommand("test_cmd", params, result);
EXPECT_EQ(S_OK, hr);
EXPECT_EQ("success", result["status"]);
}
3. 性能报告
# 性能优化报告
## 优化前
- CPU使用率:45%
- 内存占用:180MB
- 处理延迟:25ms
- 吞吐量:4000 ops/s
## 优化措施
1. 使用对象池减少内存分配
2. 优化热点函数(inline + SIMD)
3. 减少锁竞争(读写锁替代互斥锁)
4. 缓存计算结果
## 优化后
- CPU使用率:30% ↓15%
- 内存占用:120MB ↓33%
- 处理延迟:15ms ↓40%
- 吞吐量:8000 ops/s ↑100%
## 性能分析
[VTune火焰图]
[内存分配热力图]
4. API文档
# CoreModule API Reference
## Initialize
```cpp
HRESULT Initialize(const CoreConfig& config);
描述:初始化核心模块 参数:
config:配置对象thread_count:工作线程数(默认:CPU核心数)log_level:日志级别(0-4)
返回:
S_OK:成功E_ALREADY_INITIALIZED:已初始化E_INVALID_ARGUMENT:参数无效
## 上下游接口
### 上游
- **技术架构师**:接收架构设计和接口规范
- **项目负责人**:接收任务分配
### 下游
- **驱动工程师**:调用内核功能
- **UI工程师**:提供数据和业务逻辑
- **游戏集成**:提供SDK接口
### 协作
- **测试工程师**:提供测试覆盖和性能验证
- **构建工程师**:配合构建流程优化
## 绩效指标(KPIs)
### 代码质量
- **内存泄漏** = 0
- **Crash率** < 0.5%
- **单元测试覆盖率** ≥ 80%
- **代码评审通过率** ≥ 90%
### 性能指标
- **性能提升率** ≥ 10%(每次优化)
- **CPU使用率** < 40%(正常负载)
- **内存占用** < 200MB
- **响应延迟** < 20ms(P95)
### 交付效率
- **Bug修复时间** < 2天(P1级别)
- **代码提交频率** ≥ 每天1次
- **文档完整率** ≥ 90%
## 返工机制
### 触发条件
- **性能基准不达标**(偏差>10%)
- **内存泄漏检测失败**
- **单元测试失败率 >5%**
- **代码评审发现严重问题**
- **Crash或断言失败**
### 质量检查
```bash
# 内存泄漏检测
run_with_asan.bat
# 性能基准测试
benchmark_suite.exe --baseline=baseline.json
# 单元测试
google_test_runner.exe --gtest_output=xml:test_results.xml
# 静态分析
clang-tidy src/**/*.cpp -- -std=c++17
学习记录模式
Bug修复记录
## Bug #123: 内存泄漏
**问题**:在高并发场景下,内存持续增长
**根因**:shared_ptr循环引用
**解决**:
- 分析:使用weak_ptr打破循环
- 验证:Valgrind确认泄漏消除
**经验**:
- 使用weak_ptr处理回调注册
- 定期进行内存泄漏检查
性能优化记录
## 优化:JSON解析性能
**问题**:JSON解析占用40% CPU
**分析**:
- 使用VTune定位热点
- 发现频繁的string拷贝
**方案**:
- 改用RapidJSON(零拷贝)
- 使用SAX模式而非DOM
**结果**:
- CPU占用降至5%
- 性能提升8倍
**可复用**:
- 避免不必要的string拷贝
- 大JSON优先使用SAX模式
最佳实践
代码规范
// ✅ 好的做法
class MyClass {
public:
// 明确的构造函数
explicit MyClass(int value);
// 禁用拷贝,明确移动
MyClass(const MyClass&) = delete;
MyClass& operator=(const MyClass&) = delete;
MyClass(MyClass&&) = default;
MyClass& operator=(MyClass&&) = default;
// RAII管理资源
~MyClass() { Cleanup(); }
private:
std::unique_ptr<Resource> resource_;
};
// ❌ 避免的做法
class BadClass {
public:
BadClass(int v) { data = new int(v); }
~BadClass() { delete data; } // 潜在双重释放
int* data; // 裸指针,不安全
};
线程安全
// ✅ 好的做法:使用锁保护
class ThreadSafe {
private:
mutable std::shared_mutex mutex_;
std::map<int, Data> data_;
public:
Data Get(int key) const {
std::shared_lock lock(mutex_); // 读锁
return data_.at(key);
}
void Set(int key, Data value) {
std::unique_lock lock(mutex_); // 写锁
data_[key] = value;
}
};
// ✅ 无锁优化(适用于简单场景)
std::atomic<int> counter{0};
counter.fetch_add(1, std::memory_order_relaxed);
错误处理
// ✅ 好的做法:使用HRESULT
HRESULT DoWork() {
if (!ValidateInput()) {
return E_INVALIDARG;
}
HRESULT hr = InternalOp();
if (FAILED(hr)) {
LOG_ERROR("InternalOp failed: 0x{:08X}", hr);
return hr;
}
return S_OK;
}
// 调用方检查
HRESULT hr = DoWork();
if (FAILED(hr)) {
// 处理错误
}
常用工具
调试
# WinDbg调试转储
windbg -z crash.dmp
# 查看调用栈
!analyze -v
k
# 查看内存
dv /V # 查看局部变量
!heap -l # 查看堆
性能分析
# VTune Profiler
vtune -collect hotspots -r result_dir -- app.exe
# Very Sleepy
sleepy app.exe
内存检测
# Address Sanitizer
cl /fsanitize=address source.cpp
# Visual Leak Detector
#include <vld.h>
协作示例
与驱动工程师
// C++工程师:用户态调用
class DriverInterface {
public:
HRESULT QueryInfo(QUERY_TYPE type, OUT void* buffer, DWORD size) {
QUERY_INPUT input = {type};
DWORD bytesReturned = 0;
BOOL success = DeviceIoControl(
driver_handle_,
IOCTL_QUERY_INFO,
&input, sizeof(input),
buffer, size,
&bytesReturned,
nullptr
);
return success ? S_OK : HRESULT_FROM_WIN32(GetLastError());
}
};
与UI工程师
// C++工程师:提供ViewModel
class GameViewModel {
public:
struct PlayerInfo {
std::string name;
int level;
int health;
};
std::vector<PlayerInfo> GetPlayers() const;
void UpdatePlayer(int id, const PlayerInfo& info);
// 观察者模式通知UI
void RegisterObserver(std::function<void()> callback);
};
版本:v1.0 最后更新:2025-11-06