番外篇(C++工业级开发指南:从语法基础到高性能实战-盘它):从LED冬奥会、奥运会及春晚等等大屏,到手机小屏,快来挖一挖里面都有什么
·
番外篇
C++工业级开发指南:从语法基础到高性能实战
1 C++基础与核心概念
1.1 基础语法要点
变量与基本类型
- 内置类型:
int,float,double,char,bool - 类型修饰符:
signed,unsigned,short,long - 类型转换:隐式转换与显式转换(
static_cast,dynamic_cast等)
流程控制
// 条件语句
if (condition) {
// ...
} else if (condition2) {
// ...
} else {
// ...
}
// 循环语句
for (int i = 0; i < count; ++i) {
// 传统for循环
}
while (condition) {
// ...
}
do {
// ...
} while (condition);
函数基础
// 函数定义
返回类型 函数名(参数列表) {
// 函数体
return 返回值;
}
// 函数声明(在头文件中)
返回类型 函数名(参数列表);
1.2 指针、引用与内存管理
指针深入理解
int value = 42;
int* ptr = &value; // 获取地址
*ptr = 100; // 解引用
// 动态内存分配(传统方式 - 不推荐在现代C++中使用)
int* dynamicArray = new int[100];
// ... 使用
delete[] dynamicArray; // 必须手动释放
引用与指针的区别
int original = 42;
int& ref = original; // 引用,必须初始化,不能重新绑定
int* ptr = &original; // 指针,可以重新指向
ref = 100; // 直接修改original
*ptr = 200; // 通过指针修改original
const正确性
const int MAX_SIZE = 100; // 常量
const int* ptr1 = &value; // 指向常量的指针
int* const ptr2 = &value; // 常量指针
const int* const ptr3 = &value; // 指向常量的常量指针
// 函数中的const
void function(const std::string& input) { // 不修改input
// input.push_back('x'); // 错误:input是const引用
}
2 面向对象编程与现代C++特性
2.1 面向对象核心概念
类与对象
class MyClass {
private:
int private_data;
protected:
std::string protected_data;
public:
// 构造函数
MyClass() : private_data(0), protected_data("default") {}
// 成员函数
void setData(int value) { private_data = value; }
int getData() const { return private_data; } // const成员函数
// 静态成员
static int static_member;
};
// 静态成员定义
int MyClass::static_member = 42;
继承与多态
class Base {
public:
virtual void doSomething() { // 虚函数
std::cout << "Base implementation" << std::endl;
}
virtual ~Base() = default; // 虚析构函数
};
class Derived : public Base { // 公有继承
public:
void doSomething() override { // 重写基类虚函数
std::cout << "Derived implementation" << std::endl;
}
};
// 多态使用
Base* obj = new Derived();
obj->doSomething(); // 输出 "Derived implementation"
delete obj;
模板基础
// 函数模板
template<typename T>
T max(const T& a, const T& b) {
return (a > b) ? a : b;
}
// 类模板
template<typename T, int Size>
class Array {
private:
T data[Size];
public:
T& operator[](int index) { return data[index]; }
const T& operator[](int index) const { return data[index]; }
};
// 使用
Array<int, 10> intArray;
2.2 现代C++核心特性
auto关键字与范围for循环
// auto 类型推导
auto number = 42; // int
auto name = "C++"; // const char*
auto result = max(3.14, 2.71); // double
std::vector<std::string> names = {"Alice", "Bob", "Charlie"};
// 范围for循环
for (const auto& n : names) {
std::cout << n << std::endl;
}
// 传统方式对比
for (std::vector<std::string>::iterator it = names.begin();
it != names.end(); ++it) {
std::cout << *it << std::endl;
}
Lambda表达式
// Lambda表达式基本形式
auto simpleLambda = []() {
std::cout << "Hello Lambda!" << std::endl;
};
simpleLambda();
// 带参数和返回值的Lambda
auto add = [](int a, int b) -> int {
return a + b;
};
// 捕获列表
int external = 100;
auto captureLambda = [external](int param) {
return external + param; // 按值捕获external
};
auto refCapture = [&external]() {
external = 200; // 按引用捕获,可以修改external
};
// 在算法中使用Lambda
std::vector<int> numbers = {1, 2, 3, 4, 5};
std::sort(numbers.begin(), numbers.end(),
[](int a, int b) { return a > b; }); // 降序排序
3 STL标准模板库与内存管理
3.1 STL容器详解
下表总结了主要STL容器的特性和使用场景:
| 容器 | 特性 | 时间复杂度 | 使用场景 |
|---|---|---|---|
std::vector |
动态数组,连续内存 | 随机访问O(1),尾部插入/删除O(1) | 通用目的,需要随机访问 |
std::string |
字符串专用容器 | 随机访问O(1) | 字符串处理 |
std::map |
红黑树实现,键值对有序 | 插入/删除/查找O(log n) | 需要有序键值对 |
std::unordered_map |
哈希表实现 | 平均O(1),最差O(n) | 需要快速查找,不关心顺序 |
std::set |
唯一元素集合,有序 | 插入/删除/查找O(log n) | 需要有序唯一元素集合 |
std::list |
双向链表 | 插入/删除O(1),查找O(n) | 频繁在中间插入删除 |
容器实战示例
#include <vector>
#include <map>
#include <string>
#include <algorithm>
void stlDemonstration() {
// vector使用
std::vector<int> vec = {3, 1, 4, 1, 5};
vec.push_back(9); // 尾部添加
vec.pop_back(); // 尾部删除
// map使用
std::map<std::string, int> scores;
scores["Alice"] = 95;
scores["Bob"] = 87;
// 查找元素
auto it = scores.find("Alice");
if (it != scores.end()) {
std::cout << "Alice's score: " << it->second << std::endl;
}
// 算法使用
std::sort(vec.begin(), vec.end()); // 排序
auto count = std::count(vec.begin(), vec.end(), 1); // 计数
auto maxElement = std::max_element(vec.begin(), vec.end()); // 找最大值
}
3.2 智能指针与内存管理
智能指针类型对比
| 智能指针 | 所有权语义 | 使用场景 |
|---|---|---|
std::unique_ptr |
独占所有权 | 单一所有者,资源自动释放 |
std::shared_ptr |
共享所有权 | 多个所有者,引用计数 |
std::weak_ptr |
不拥有所有权 | 打破shared_ptr循环引用 |
unique_ptr - 独占所有权
#include <memory>
class Resource {
public:
Resource() { std::cout << "Resource acquired\n"; }
~Resource() { std::cout << "Resource destroyed\n"; }
void doWork() { std::cout << "Working...\n"; }
};
void uniquePtrDemo() {
std::unique_ptr<Resource> ptr1 = std::make_unique<Resource>();
ptr1->doWork();
// std::unique_ptr<Resource> ptr2 = ptr1; // 错误:不能复制
std::unique_ptr<Resource> ptr2 = std::move(ptr1); // 转移所有权
if (!ptr1) {
std::cout << "ptr1 is now null after move\n";
}
} // Resource自动释放
shared_ptr与weak_ptr - 共享所有权
struct Node {
std::string value;
std::shared_ptr<Node> next;
std::weak_ptr<Node> prev; // 使用weak_ptr避免循环引用
Node(const std::string& val) : value(val) {
std::cout << "Node " << value << " created\n";
}
~Node() {
std::cout << "Node " << value << " destroyed\n";
}
};
void sharedPtrDemo() {
auto node1 = std::make_shared<Node>("first");
auto node2 = std::make_shared<Node>("second");
node1->next = node2;
node2->prev = node1; // 使用weak_ptr,不会增加引用计数
std::cout << "node1 use count: " << node1.use_count() << std::endl; // 1
std::cout << "node2 use count: " << node2.use_count() << std::endl; // 2
// 访问weak_ptr
if (auto shared_prev = node2->prev.lock()) {
std::cout << "Previous node: " << shared_prev->value << std::endl;
}
} // 两个Node都能正确释放
4 工业级实践与性能优化
4.1 Effective C++核心条款
RAII(Resource Acquisition Is Initialization)机制
// RAII文件处理类
class FileHandler {
private:
std::FILE* file_;
public:
explicit FileHandler(const std::string& filename, const std::string& mode)
: file_(std::fopen(filename.c_str(), mode.c_str())) {
if (!file_) {
throw std::runtime_error("Failed to open file");
}
}
~FileHandler() {
if (file_) {
std::fclose(file_);
}
}
// 禁止拷贝
FileHandler(const FileHandler&) = delete;
FileHandler& operator=(const FileHandler&) = delete;
// 允许移动
FileHandler(FileHandler&& other) noexcept : file_(other.file_) {
other.file_ = nullptr;
}
FileHandler& operator=(FileHandler&& other) noexcept {
if (this != &other) {
if (file_) std::fclose(file_);
file_ = other.file_;
other.file_ = nullptr;
}
return *this;
}
void write(const std::string& content) {
if (file_) {
std::fputs(content.c_str(), file_);
}
}
};
// 使用RAII,无需手动管理资源
void useFile() {
FileHandler file("data.txt", "w");
file.write("Hello, RAII!");
// 文件自动关闭,即使发生异常也不例外
}
性能优化关键技巧
- 避免不必要的拷贝
// 不佳的实现
std::vector<int> processData(std::vector<int> input) { // 按值传递,可能产生拷贝
std::vector<int> result;
// ... 处理
return result; // NRVO优化
}
// 优化的实现
void processData(const std::vector<int>& input, // 常量引用,避免拷贝
std::vector<int>& output) { // 输出参数
// ... 处理
}
// 或者使用移动语义
std::vector<int> processData(std::vector<int>&& input) { // 右值引用
std::vector<int> result = std::move(input); // 移动而非拷贝
// ... 处理
return result;
}
- 预留空间减少重新分配
void efficientVectorUsage() {
std::vector<int> numbers;
numbers.reserve(1000); // 预留空间,避免多次重新分配
for (int i = 0; i < 1000; ++i) {
numbers.push_back(i); // 不会触发重新分配
}
}
4.2 实战项目:内存安全矩阵类
#include <memory>
#include <vector>
#include <stdexcept>
template<typename T>
class Matrix {
private:
size_t rows_;
size_t cols_;
std::unique_ptr<T[]> data_; // 使用unique_ptr管理内存
public:
// 构造函数
Matrix(size_t rows, size_t cols)
: rows_(rows), cols_(cols),
data_(std::make_unique<T[]>(rows * cols)) {}
// 移动构造函数
Matrix(Matrix&& other) noexcept
: rows_(other.rows_), cols_(other.cols_),
data_(std::move(other.data_)) {
other.rows_ = 0;
other.cols_ = 0;
}
// 移动赋值运算符
Matrix& operator=(Matrix&& other) noexcept {
if (this != &other) {
rows_ = other.rows_;
cols_ = other.cols_;
data_ = std::move(other.data_);
other.rows_ = 0;
other.cols_ = 0;
}
return *this;
}
// 禁止拷贝
Matrix(const Matrix&) = delete;
Matrix& operator=(const Matrix&) = delete;
// 访问元素
T& operator()(size_t row, size_t col) {
checkBounds(row, col);
return data_[row * cols_ + col];
}
const T& operator()(size_t row, size_t col) const {
checkBounds(row, col);
return data_[row * cols_ + col];
}
// 矩阵运算
Matrix operator+(const Matrix& other) const {
if (rows_ != other.rows_ || cols_ != other.cols_) {
throw std::invalid_argument("Matrix dimensions don't match");
}
Matrix result(rows_, cols_);
for (size_t i = 0; i < rows_ * cols_; ++i) {
result.data_[i] = data_[i] + other.data_[i];
}
return result;
}
size_t rows() const { return rows_; }
size_t cols() const { return cols_; }
private:
void checkBounds(size_t row, size_t col) const {
if (row >= rows_ || col >= cols_) {
throw std::out_of_range("Matrix indices out of range");
}
}
};
// 使用示例
void matrixDemo() {
Matrix<double> mat1(2, 2);
mat1(0, 0) = 1.0; mat1(0, 1) = 2.0;
mat1(1, 0) = 3.0; mat1(1, 1) = 4.0;
Matrix<double> mat2(2, 2);
mat2(0, 0) = 5.0; mat2(0, 1) = 6.0;
mat2(1, 0) = 7.0; mat2(1, 1) = 8.0;
auto result = std::move(mat1) + mat2; // 使用移动语义
std::cout << "Result: " << result(0, 0) << ", " << result(0, 1) << std::endl;
std::cout << " " << result(1, 0) << ", " << result(1, 1) << std::endl;
}
5 大厂面试准备与学习路径
5.1 工业界应用场景
在手机影像等领域,C++主要用于:
- 高性能图像处理算法:利用模板和SIMD指令优化
- 实时视频处理:使用多线程和内存池技术
- 硬件加速:通过C++直接操作底层硬件资源
- 算法部署:将Python训练的模型用C++部署到端侧
- 如果想了解一些成像系统、图像、人眼、颜色等等的小知识,快去看看视频吧 :
- 抖音:数字图像哪些好玩的事,咱就不照课本念,轻轻松松谝闲传
- 快手:数字图像哪些好玩的事,咱就不照课本念,轻轻松松谝闲传
- B站:数字图像哪些好玩的事,咱就不照课本念,轻轻松松谝闲传
- 认准一个头像,保你不迷路:

- 认准一个头像,保你不迷路:
更多推荐

所有评论(0)