找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2791

积分

0

好友

387

主题
发表于 昨天 22:51 | 查看: 0| 回复: 0

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

C++语言优势与矛盾示意图

C++虽年过四十,依然抗打。

一、谁都敢踩一脚的开发语言

几乎所有主流开发语言都能找出批判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++一直被围攻却依然坚挺,核心在于它拥有几条难以被绕过的护城河。

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开始,这门语言就在持续地自我革新,努力解决自身的痛点。

现代C++版本演进与特性图

1、智能指针终结裸指针滥用

是时候告别手写的newdelete了。

// 别再写 new/delete
auto data = std::make_unique<BigData>();
process(std::move(data)); // 移动语义避免拷贝

合理使用unique_ptrshared_ptrweak_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++真正的“问题”,或许不在于它本身有多复杂,而在于它总被用在不该用的地方。

C++正确与错误使用场景对比图

有人拿它写CRUD(增删改查),也有人用它写HTTP服务器、解析JSON API请求。这其实不是C++的错,而更多是技术负责人在选型时没想清楚核心诉求:你到底要的是快速的开发迭代速度,还是对系统每一寸资源的绝对控制力?

现在不妨问问自己:你上次使用C++,是在编写普通的业务逻辑,还是在想方设法榨干硬件的最后一滴性能呢?搞清楚这个问题,或许就能找到C++在你技术栈中的正确位置。更多关于编程语言特性与工程实践的深度讨论,欢迎来云栈社区与大家交流。




上一篇:中电信AI研究院发布TeleWorld 4D世界模型:18B参数实现每秒8帧实时高清视频生成
下一篇:闲鱼寄快递省钱技巧实测:双账号互拍实现最低运费羊毛攻略
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-2-2 22:07 , Processed in 0.367388 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表