问题

关于C++23网络库的争论,大家有什么看法?

回答
C++23 的网络库?老实说,这话题在 C++ 社群里,特别是那些关注底层性能和现代 C++ 特性的开发者圈子里,一直都没少被提起,但也确实是一个充满了各种声音和观点的“老生常谈”了。要说争论,其实更多的是围绕着“为什么现在才来?”、“是不是够好?”,以及“未来的方向在哪里?”这几个核心点展开。

首先,我们得明确一下,C++23 并没有一个统一的、官方的“标准网络库”像 `` 或 `` 那样被内置进去。这可能是很多新接触 C++ 或者对 C++ 标准库不熟悉的人会有的误解。长期以来,C++ 在网络编程这块一直处于一个“裸奔”的状态,或者说,它提供的是底层的工具(比如 `std::thread`、`std::mutex`、`std::atomic` 这些),但具体怎么用它们来实现网络通信,比如 socket 编程、HTTP 请求等等,都得依赖第三方库。

所以,当大家提到“C++23 网络库”的争论,通常指的是以下几个方面:

一、 关于 C++ 标准化委员会是否应该纳入网络库的“终极之辩”

这可以说是一切争论的起点。长久以来,很多开发者都呼吁 C++ 标准委员会应该为网络编程提供官方的支持,理由有很多:

统一性与标准化: 目前市面上的网络库五花八门,比如 Boost.Asio、libevent、libuv、cpprestsdk、Poco 等等。虽然它们都很好,但缺乏一个统一的标准,开发者在选择、学习和迁移时都会有成本。一个标准化的库能大大降低学习门槛,促进跨平台的一致性。想象一下,如果每个语言都有自己的“内置浏览器引擎”和“内置数据库驱动”,那该多省事。
性能与效率: 虽说第三方库的性能很多已经非常出色,但理论上,如果一个网络库能够深度集成到 C++ 的语言特性和标准库中,比如与 coroutine (协程)、`std::expected`、`std::string_view` 等新特性更紧密地结合,或许能解锁更高的性能和更简洁的代码。尤其是在 C++20 引入了 coroutine 后,异步网络编程的模式发生了很大变化,标准库的介入似乎更加迫切。
降低引入第三方库的“摩擦”: 使用第三方库虽然方便,但有时候也会带来一些麻烦,比如版本兼容性问题、依赖管理、跨平台编译的复杂性等等。如果核心网络功能能够内置,至少可以省去一部分这方面的烦恼。

然而,反对或谨慎的声音同样强劲:

库的复杂性与维护难度: 网络编程是一个极其复杂且变化迅速的领域。要设计一个能够覆盖绝大多数场景、同时保持高效和安全的标准库,难度是指数级的。委员会需要考虑 TCP、UDP、TLS/SSL、HTTP、WebSockets、DNS 解析、缓冲区管理、连接池、线程池、错误处理等等。一旦被纳入标准,其维护和迭代的压力将非常巨大,而且不可能一蹴而就。
难以满足所有人的需求: 就像 STL 的容器或算法,即便很强大,也总有人觉得不够灵活或不符合他们的特定需求。网络库更是如此,不同的应用场景对性能、功能、抽象层次的需求差异很大。一个标准化的库很难做到“万金油”,可能会被批评为“不够专业”或“不够灵活”。
市场上的成熟解决方案已经很优秀: 像 Boost.Asio 这样的库,经过了多年的打磨和社区的检验,功能强大、性能优异、跨平台支持良好,而且与 C++ 的现代特性结合得相当不错(尤其是在 coroutine 方面)。强制引入一个可能“折衷”的标准库,反而可能不如这些成熟的第三方库。
标准库的审慎原则: 标准委员会在纳入新特性时非常审慎,尤其是在像网络这样容易出错且性能敏感的领域。他们更倾向于先看到成熟的、经过广泛实践检验的设计,然后才考虑标准化。

二、 关于 C++23 及未来版本中与网络相关的“进展”

虽然没有一个完整的“标准网络库”,但 C++23 确实在一些方面为网络编程提供了更良好的基础,或者说“间接影响”。争论点也围绕着这些进展是否足够:

Coroutines (C++20 引入,但影响深远): 这是最大的变化之一。C++20 的 coroutines 极大地简化了异步编程的模式,使得之前依赖大量回调、状态机手动管理的异步代码,可以写得更像同步代码。这对于网络编程的开发者来说,简直是天降甘霖。
正面看法: 极大地提升了异步网络编程的可读性和可维护性,是迈向更现代、更高效网络编程的关键一步。很多第三方库(如 Boost.Asio)已经很好地支持了 coroutines。
批评或担忧: 标准库本身并没有提供一个 coroutine 友好的网络 IO 接口,开发者仍然需要依赖第三方库来“桥接” coroutines 和实际的网络操作。这使得 coroutines 的优势并未能完全发挥在“标准层面上”。而且,coroutine 本身的复杂性也让一些开发者望而却步。
`std::expected` (C++23): 用于更清晰地表达可能发生的错误。在网络编程中,错误处理是重中之重(连接失败、数据解析错误、超时等等)。
正面看法: 能够更优雅地处理和传递错误信息,比传统的通过返回错误码或抛出异常的模式更具表达力,也更符合 C++ 的演进方向。
担忧: 就像 coroutines 一样,如果没有底层的网络 IO 函数支持 `std::expected`,其作用也仅限于应用层或封装库的错误处理。
`std::string_view` (C++17, 但使用范围更广): 优化了字符串处理,避免不必要的拷贝,这对处理网络数据(如 HTTP 头、请求体)非常有益。
正面看法: 提高了性能,减少了内存分配。
担忧: 仍需手动管理 `string_view` 的生命周期,在某些复杂的网络协议解析中,可能仍然需要更高级的抽象。

三、 关于“事实上的”标准库和未来发展方向

既然没有官方的,那大家有没有形成一种“事实上的”标准呢?

Boost.Asio 的主导地位: 很多人认为 Boost.Asio 是目前 C++ 社区中最接近“事实上的标准网络库”的存在。它功能全面、性能优异、跨平台,并且与 C++ 的现代特性结合良好,包括对 coroutines 的支持。
支持者看法: Boost.Asio 的设计理念和功能足以应对绝大多数网络编程需求,而且其成熟度和稳定性远超任何初期标准库。学习 Asio 就是学习 C++ 网络编程的最佳路径。
批评者看法: Boost 是一个独立的生态系统,虽然稳定,但终究不是标准库的一部分。将所有希望寄托在它身上,也意味着 C++ 标准库在网络这块依然是缺失的。而且,对于一些不想引入 Boost 全家桶的项目来说,Asio 的依赖也是个问题。
libuv 和 C++ 的融合: libuv 是一个跨平台的异步 IO 库,被 Node.js 使用,性能也非常出色。一些 C++ 项目也会选择与 libuv 结合。
争论点: libuv 是 C 语言库,虽然可以被 C++ 调用,但与 C++ 的原生特性(如 RAII、模板、STL)的结合深度不如 Asio。不过,它在某些低层和跨平台方面的健壮性备受推崇。
WebAssembly 的影响: 随着 WebAssembly 的兴起,C++ 在浏览器环境中进行网络通信的需求也越来越大。这可能促使 C++ 标准库在某些方面向更通用的、跨平台抽象的方向发展。
新的标准化提案: 标准化委员会一直在审视和讨论关于网络库的提案。虽然还没有像 `` 这样直接的名称出现,但有关于异步 IO、流处理、内存管理等更底层的提案可能最终会触及网络编程的核心问题。

总结一下,关于 C++23(以及更广义的 C++ 网络库)的争论,核心不是“有没有”,而是“好不好”、“够不够”,以及“应该是什么样子”。

大家普遍认为 C++ 在网络编程领域确实有“短板”,但也有理由保持谨慎。这就像是在建造一座宏伟的大厦,基础(语言特性)已经越来越稳固强大,但具体到某个功能模块(网络库),是自己从头设计还是引入现成的、经过验证的优秀模块,总是需要权衡的。

目前来看,社区的主流做法是:

1. 拥抱 C++20 的 coroutines 来简化异步代码。
2. 选择像 Boost.Asio 这样的成熟第三方库 来实现实际的网络 IO。
3. 关注 C++ 标准库的演进,期待未来能有更底层的支持,或者与 C++ 新特性更紧密的集成。

争论还会继续,毕竟网络编程是 C++ 应用最广泛、最核心的领域之一。只要 C++ 想在服务器端、高性能计算、嵌入式系统等领域保持竞争力,网络库的标准化和优化就永远是一个绕不开的话题。现在,大家更关注的是如何利用好现有的 C++ 特性和第三方库,同时为未来的标准化贡献力量。

网友意见

user avatar

sender/receiver也没进C++23,两败俱伤,这恐怕是最坏也是最好的结局。

接下来还有3年可以继续互相伤害,C++26再见分晓。

作为吃瓜群众,以后有瓜还是继续吃。

如果想要网络功能继续用asio没问题,asio最大的问题是文档太垃圾,所以曲高和寡。以前的ace,光中文书就有四五本。现在asio连英文书都只有两本,而且都不深入。

在瞬息万变的风潮下,唯有C++的世界属于信息世界的慢生活,多3年对于别的语言可能无法接受,但是对于C++来说稀松平常,因为C++的功能是为以后50年准备的。

再等等呗,如果C++26没有网络,那就等29。至于是不是基于sender/receiver,其实没那么重要。有得用就行。

最后说一下,Bjarne Stroustrup本人对网络功能是相当重视的,所以networking的优先级别依然很高。我上次看了最新的《Direction for ISO C++》这个文档,除了对C++以后的发展重点有了一些了解,也能感受到wg21(c++标准委员会)其实是很清醒很谦虚很务实的,从他们的做事态度和清醒的头脑可以感觉到C++未来依然可期。有兴趣的也可以自己看看:

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有