当前位置: 首页 > news >正文

C++用了20年才让std::string不在堆上分配短字符串——从COW的引用计数到SSO的union trick

写C++的人大概都有过这样的疑惑:std::string到底有多大?

随手写一行sizeof(std::string),GCC编出来是32,Clang编出来可能是24,MSVC编出来也是32。同一个标准库类,三家编译器给出三个不同的答案。更奇怪的是,你用std::string s = "hello"构造一个5字符的字符串,然后在调试器里看它的内部结构,会发现一件反常识的事——字符数据直接存在对象内部的一个char数组里,根本没有调用malloc,根本没有堆分配。

但你把字符串换长一点,比如std::string s = "this is a somewhat longer string",再看调试器——布局完全变了,对象内部出现了一个指向堆内存的指针,字符数据被malloc丢到了堆上。

分界线在哪里?libstdc++是15个字符,libc++是22个字符,MSVC STL也是15个字符。同一个std::string,三家标准库对"短"的定义差了将近50%。

这个"短字符串不分配堆内存"的优化叫SSO(Short String Optimization)。它是今天所有主流C++标准库的默认实现策略。但很多人不知道的是,SSO并不是std::string从一开始就有的设计。在SSO之前,C++标准库用了另一种完全不同的策略来优化字符串——COW(Copy-On-Write,写时拷贝)。GCC的libstdc++从1997年左右开始使用COW策略,一直用到2015年GCC 5发布时才正式切换到SSO。

从COW到SSO,中间隔了将近20年。

http://www.jsqmd.com/news/614792/

相关文章:

  • 让桌面信息管理效率提升3倍的工具
  • 2026年AI使用者核心能力指南:从提示工程到Agent架构的完整知识体系
  • 从 Apache SeaTunnel 走向 ASF Member:一位开发者的长期主义样本凡
  • 我写了一套内容分析系统,专门拆解爆款博主的选题逻辑
  • Innovative Control Strategies for PMSM: Full-Sp...
  • 低空经济找工作不用愁!认准这家垂直招聘平台
  • 中国老龄协会:积极应对人口老龄化中国实践 2025
  • 【精华收藏】Java工程师的智能体转型:20万到60万的年薪跨越,技术人必看
  • 工业场景实测!C#调用YOLOv8/v11的OpenCV DNN vs ONNXRuntime全对比,避坑+选型指南
  • xDeepFM实战解析:如何通过压缩交互网络提升推荐系统的特征交互能力
  • 紫鸟安全管家:正式上线【限制商业信息编辑】 功能 - 速递信息
  • 为什么92%的团队在EF Core 10向量集成中踩坑?:权威披露微软内部验证通过的4层架构分治模型
  • 从OOM每周3次到零故障!SpringBoot+JVM+MySQL全链路性能调优实战
  • EF Core 原生 SQL 实战:FromSql、SqlQuery 与对象映射边界慌
  • 花三分钟读完:2026年马耳他护照中介选型攻略,从此不再被忽悠(实用版) - 速递信息
  • 猫抓浏览器扩展终极指南:3步掌握网页资源嗅探与下载的完整解决方案
  • 第15章 Mosquitto生产环境部署实践
  • Python入门教程(全网最详细),零基础入门到精通,从看这一篇开始!
  • 还在为充气泵电压波动导致MCU复位发愁吗?CSM53系列拥有40V宽压输入配合优秀的瞬态响应,轻松抵御电机启停浪涌,配合2.5μA微功耗,让你的便携充气泵续航提升30%!
  • 20260409紫题训练总结 - Link
  • 小程序挖洞必备神器|集成接口信息收集、路由枚举,Frida注入助力挖洞高效落地(2026-4-8)更新
  • 2026年济南奥迪烧机油治理:口碑与效果双丰收的秘诀
  • 智见未来 | 融合传统视觉与深度学习的AI水位识别技术实践分享
  • 第16章 Mosquitto客户端开发实战
  • 如何在 Go 中超时终止进程及其所有子进程
  • 龙芯k - 走马观碑组MPU驱动移植睬
  • OpenClaw工具拆解之exec
  • GraalVM Native Image安全性加固实战:5步完成TLS/反射/动态代理全链路可信验证,规避97.3% CVE-2023类漏洞
  • 如何配置表结构支持读写分离标记_在COMMENT中添加路由规则的架构级应用
  • 2026届必备的六大降重复率工具推荐