欢迎光临
我们一直在努力

深度解析:为什么 Copy-on-Write 字符串在多核高并发时代必然消亡?

大多数 C++ 工程师被问到\”C++11 为什么不允许 COW string\”时回答\”因为线程安全\”。这个答案只对了一半。线程安全是附加理由,真正从标准层面把 COW string 堵死的,是一条关于 operator[] 的迭代器失效规则。它写在 C++11 [basic.string]/5 里,只有一段话,语气平淡,后果是地震级的:libstdc++ 不得不在 GCC 5.1 里把 std::string 的实现从 COW(写时复制)换成 SSO(小字符串优化),sizeof 从 8 字节涨到 32 字节,而为了不让所有已编译的 Linux 二进制同一天爆炸,又不得不造出 dual ABI——用一个叫 _GLIBCXX_USE_CXX11_ABI 的宏和一个 inline namespace,让新旧两套 std::string 作为两个完全不同的链接器符号,共存在同一个 libstdc++.so 里。

这个方案在工程上是精确的手术。但手术的副作用延续了 9 年。PyTorch 的官方 wheel 直到 2024 年的 2.4 版本才从 ABI=0 切到 ABI=1;在此之前,整个 Python ML 生态的 C++ extension 都被迫跟着用旧 ABI,undefined reference to std::__cxx11::basic_string<char>… 是 C++ 开发者群里出现频率最高的链接报错之一。一个宏,把 Linux C++ 生态劈成了两半。

这篇文章逐件拆四样东西:COW string

赞(0)
未经允许不得转载:171主机测评 » 深度解析:为什么 Copy-on-Write 字符串在多核高并发时代必然消亡?
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址