C++最尴尬吗?不,真正尴尬的是那些一边用着C++的产品,还一边骂C++太复杂该淘汰的人。我干开发好些年,踩过内存泄漏的坑,也尝过榨干CPU最后一滴性能的滋味。

C++虽年过四十,依然抗打。
一、谁都敢踩一脚的开发语言
几乎所有主流开发语言都能找出批判C++的理由,而且听起来都挺在理。

1、Python、JS嘲笑C++开发慢
Python团队用FastAPI十分钟就能搭出一个接口,而C++这边,配CMake、管vcpkg、防ABI破坏,折腾三天可能还没跑通一个hello world。
2、Java、C#、Go说C++工程管理太野
Java团队靠Spring Boot一天就能搭出微服务,稳定性还不错。而在C++项目里,你可能只是改了个头文件,CI就得跑上两个小时,最后还可能因为GCC版本不一致导致编译失败。更头疼的是包管理,用vcpkg装个OpenSSL,依赖冲突能让你搞到凌晨三点。相比之下,Go一个go mod tidy就能轻松搞定。
3、Rust直接攻击C++内存安全的命门
Rust的所有权模型在编译期就杜绝了空指针、野指针、数据竞争。而C++即便有智能指针,也挡不住有人非要手写new/delete,或者误用shared_ptr导致循环引用。现代C++通过unique_ptr、RAII、移动语义,已经大幅减少了典型错误,但依然无法像Rust那样从根源上铲除所有隐患。
4、C语言说C++太“魔法”
C社区最反感C++那些隐式行为:构造函数在你眼皮子底下悄悄执行,异常让控制流到处乱飞。所以Linux内核不用C++,许多嵌入式驱动也尽量避开。C++确实能通过extern “C”无缝调用C代码,这是它的一个强项。但在内核这类极端场景下,即便你承诺不使用异常、RTTI和虚函数,C++编译器生成的代码仍可能引入一些不可预测的符号或初始化顺序,这就足以让它被拒之门外。
二、C++的护城河
C++一直被围攻却依然坚挺,核心在于它拥有几条难以被绕过的护城河。

1、游戏引擎和图形渲染
Unreal Engine、Unity底层、V-Ray渲染器,这些工具全都依赖C++来榨干GPU和CPU的最后一滴性能。看看下面这个纹理类的例子:
class Texture {
GLuint id_;
public:
Texture(const std::string& path) {
glGenTextures(1, &id_);
// 加载纹理...
}
~Texture() { glDeleteTextures(1, &id_); }
Texture(const Texture&) = delete;
Texture& operator=(const Texture&) = delete;
Texture(Texture&& other) noexcept : id_(other.id_) {
other.id_ = 0;
}
};
这种零开销、确定性释放资源的模式,在带垃圾回收(GC)的语言里是无法实现的。
2、高频交易和实时系统
在风控引擎或订单匹配模块中,QPS(每秒查询率)可能超过50万,要求延迟小于10微秒。在这里,任何GC停顿、虚函数间接调用或缓存未命中都是不可接受的。C++允许对内存布局进行外科手术般的精细控制:
// 用 placement new 在预分配内存池中构造对象
alignas(64) char order_pool[1024 * 1024];
void* alloc = order_pool;
auto* order = new (alloc) Order(...);
// 手动调用析构,但不释放内存
order->~Order();
这种级别的控制力,几乎是C++的独门绝技。
3、高性能库的底层实现
Python的NumPy、PyTorch,Node.js的native addon,它们底层计算最密集的部分几乎全是C++写的。以PyTorch为例,其卷积算子用C++/CUDA实现后,性能比纯Python版本快了不止两个数量级。这种差距,在训练千亿参数模型时,意味着天与小时的区别。
例如PyTorch的卷积算子:
at::Tensor conv2d(
const at::Tensor& input,
const at::Tensor& weight,
const at::Tensor& bias,
IntArrayRef stride,
IntArrayRef padding) {
// 调用高度优化的 C++/CUDA 内核
return at::native::convolution(input, weight, bias, ...);
}
可以说,没有C++,这些流行框架的性能会直接腰斩。这正是系统编程追求极致性能的典型体现。
三、现代C++在自救
从C++11开始,这门语言就在持续地自我革新,努力解决自身的痛点。

1、智能指针终结裸指针滥用
是时候告别手写的new和delete了。
// 别再写 new/delete
auto data = std::make_unique<BigData>();
process(std::move(data)); // 移动语义避免拷贝
合理使用unique_ptr、shared_ptr、weak_ptr,能极大提升内存安全性。
2、constexpr把计算移到编译期
利用constexpr,我们可以在编译期完成计算,进一步提升运行时性能。
constexpr int factorial(int n) {
return n <= 1 ? 1 : n * factorial(n - 1);
}
int arr[factorial(5)];
3、范围for和算法库简化循环
现代C++让遍历和操作容器变得更加简洁明了。
std::vector<int> nums = {1, 2, 3, 4, 5};
for (int x : nums) {
std::cout << x << "\n";
}
// 算法
std::for_each(nums.begin(), nums.end(), [](int x) {
std::cout << x << "\n";
});
4、模块系统解决头文件地狱
C++20引入的模块特性,有望让编译速度获得数倍的提升。
// math.ixx
export module math;
export int add(int a, int b) { return a + b; }
// main.cpp
import math;
int main() { return add(2, 3); }
四、C++不尴尬,尴尬的是拿它写CRUD
C++真正的“问题”,或许不在于它本身有多复杂,而在于它总被用在不该用的地方。

有人拿它写CRUD(增删改查),也有人用它写HTTP服务器、解析JSON API请求。这其实不是C++的错,而更多是技术负责人在选型时没想清楚核心诉求:你到底要的是快速的开发迭代速度,还是对系统每一寸资源的绝对控制力?
现在不妨问问自己:你上次使用C++,是在编写普通的业务逻辑,还是在想方设法榨干硬件的最后一滴性能呢?搞清楚这个问题,或许就能找到C++在你技术栈中的正确位置。更多关于编程语言特性与工程实践的深度讨论,欢迎来云栈社区与大家交流。