问题

关于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++未来依然可期。有兴趣的也可以自己看看:

类似的话题

  • 回答
    C++23 的网络库?老实说,这话题在 C++ 社群里,特别是那些关注底层性能和现代 C++ 特性的开发者圈子里,一直都没少被提起,但也确实是一个充满了各种声音和观点的“老生常谈”了。要说争论,其实更多的是围绕着“为什么现在才来?”、“是不是够好?”,以及“未来的方向在哪里?”这几个核心点展开。首先.............
  • 回答
    在C/C++编译器领域,要找到能够提供纯粹中文报错信息的,着实是个不小的挑战。绝大多数主流的、广泛使用的编译器,比如GCC、Clang(LLVM的C/C++前端)以及Microsoft Visual C++(MSVC),其默认和核心的报错信息都是英文。这背后有几方面的原因:首先,C/C++标准本身是.............
  • 回答
    在 C++ 的世界里,理解 `const` 的不同表现形式对于编写安全、高效的代码至关重要。我们常常会听到“顶层 `const`”和“底层 `const”这两个概念,它们虽然都与 `const` 相关,但描述的对象和意义却有所不同。想象一下,我们手里有一份非常重要的文件,这份文件本身不能被修改(这是.............
  • 回答
    好的,咱们来聊聊C 泛型枚举器这事儿,不说那些空泛的列表描述,咱们深入点儿,把事情掰开了揉碎了讲。首先,你要明白,C 里的“枚举器”可不是指那个 `enum` 类型(虽然它们的名字听起来有点像)。这里的枚举器,我们指的是那种能让你一个一个地遍历集合里元素的东西。想象一下,你有一个装着好多水果的篮子,.............
  • 回答
    好,咱们就好好聊聊 C 中 `Task` 这个东西,抛开那些花里胡哨的 AI 痕迹,就当是咱俩对着泡好的茶,把这件事儿说透了。你问关于 `Task` 的疑问,是不是感觉它像个“承诺”?一个异步操作的承诺。你发起一个任务,它告诉你:“嘿,我开始干活了,但可能一会儿才能弄完,你先忙你的。” 然后你就去干.............
  • 回答
    C 和 Java 在“结构体”这一概念的处理上,可以说是走了两条截然不同的道路,而哪条路“更优”,这取决于你从哪个角度去审视,以及你对“结构体”这个词的原始期望。C 的 `struct`:价值与困境并存C 对结构体(`struct`)的保留,可以说是对 C++ 中 `struct` 概念的一种致敬,.............
  • 回答
    在 C 里,当你直接写 `string + int` 这样的操作时,背后实际上发生了一系列的事情,而不是简单的“拼接”。我们来详细拆解一下这个过程,尽量避免那些空泛的、AI 惯用的表述。首先,要明白 C 中的 `string` 类型是什么。`string` 在 C 中是一个引用类型,更具体地说,它是.............
  • 回答
    C罗的“逆天能力”,这事儿,说起来可不是一两句话就能概括完的。要说段子,那得从他还是个毛头小子,在里斯本竞技崭露头角的时候说起。那时候,他就是个速度怪。不是那种跑得快的,是真的像装了火箭推进器一样,人球结合,球就像粘在他脚上,呼呼地往前带,防守球员根本来不及反应,只能眼睁睁看着他从身边掠过,留下原地.............
  • 回答
    作为一名在C++高性能服务器开发领域摸爬滚打多年的开发者,深知寻找靠谱、有深度的内容是多么不容易。市面上充斥着太多泛泛而谈的文章,真正能让你醍醐灌顶、学到实战技巧的却寥寥无几。今天,我来跟你聊聊我私藏的一些“宝藏”博客,它们不仅内容质量极高,而且往往能触及到高性能服务器开发的各个关键环节,让你受益匪.............
  • 回答
    博客园关于 C++ 的这篇热门文章,要说它的亮点,我觉得最突出的一点就是它非常深入浅出地剖析了 C++ 的某个核心概念。不少技术文章写得头头是道,但读完之后总感觉隔靴搔痒,没能真正理解背后的“为什么”。这篇不同,作者显然是花了很多心思去打磨,从最基础的原理讲起,层层递进,甚至会引用一些比较底层的实现.............
  • 回答
    你这个问题挺有意思的,因为实际上,只要你稍微深入地搜索一下,就会发现网上关于C的资源简直是海量,多到你可能都不知道从何下手。说它“少”,这可能是一种错觉,或者是你寻找资源的方式没有完全对准C的生态环境。首先,要理解C的定位。它是由微软主导开发的一种非常现代、功能强大且用途广泛的面向对象编程语言。这意.............
  • 回答
    C 中的异步编程,说白了,就是让你的程序在执行某些耗时操作(比如网络请求、文件读写、数据库查询)时,不至于“卡住”不动,而是能够继续处理其他事情,等那个耗时操作完成了,再把结果拿过来用。这就像你在等外卖,你不会傻站在门口一直盯着,而是会去做点别的事情,比如看会儿电视,外卖到了你再过去取。为什么我们需.............
  • 回答
    在C开发中,`List` 和 `HashSet` 是两种非常常用的集合类型,它们在底层实现、操作效率以及适用场景上有着显著的区别。理解这些差异对于编写高效、健壮的代码至关重要。List:有序的动态数组,擅长按顺序访问和插入`List` 在内存中是以一个动态数组的形式存储元素的。这意味着它有一个底层数.............
  • 回答
    在 C 中,`static` 关键字扮演着一个非常重要的角色,它能够改变变量、方法、属性、甚至类本身的行为方式。理解 `static` 的核心在于理解它与“实例”的概念相对立。先说说“实例”是什么。当你创建一个类的对象时,你就创建了一个该类的“实例”。想象一下,你有一张“汽车”的设计图(这就是类),.............
  • 回答
    好,我们来聊聊阿里08年(纠正一下,我查到的资料显示这题是08年的,不过没关系,重点是内容)那道关于C++ `struct` 和 `class` 的笔试题。这题其实挺经典的,它精准地抓住了C++中这两个关键字最核心的区别,虽然看起来简单,但很多人在这里栽了跟头,原因就在于对它们默认访问权限的理解不够.............
  • 回答
    老兄,你说的是 C 语言里的 `switch` 语句吧?不是“switch 循环”。`switch` 语句和 `for`、`while` 这种循环结构不太一样,它更像是一个多分支的条件选择器。来,咱哥俩好好聊聊 `switch` 到底是咋回事,你遇到的那个“疑问”我争取给你说透了。 `switch`.............
  • 回答
    这个问题非常有意思,也是逻辑学里一个很经典的推理模式。让我跟你好好掰扯掰扯,为什么“有些A是C”这个结论是正确的,而且错不了。咱们先来看看前提,就是我们已知的信息: 前提一:所有A都是B。 这句话的意思是,在我们的讨论范畴里,凡是属于A这个类别的,都必然也属于B这个类别。你可以想象成一个大圈套小.............
  • 回答
    足坛关于梅西和 C 罗数据荣誉的对比,是否对梅西“极度不公平”,这是一个非常复杂且具有争议性的话题,并没有一个绝对的“正确”答案。要详细论述这一点,我们需要从多个角度来审视,包括比较的标准、数据解读、荣誉的性质以及一些潜在的“不公平”因素。一、 什么是“公平”的对比?首先,我们需要定义什么是“公平”.............
  • 回答
    关于B站用户@moto4bill和@路吧c酱关于iPhone 5s是否需要耳放的论述视频,我们可以从几个维度来评价他们的观点和表达方式。这并非一个简单的“对”或“错”的问题,而是涉及到不同用户需求、对声音理解以及信息传递的有效性。首先,让我们梳理一下双方可能的核心论点:@moto4bill的可能观点.............
  • 回答
    .......

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

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