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

string的两种实现

1. 内存布局对比(32位系统)

(1) MSVC
  • Debug 模式:28 字节

    cpp

    union {char _Buf[16];      // 短字符串缓冲区(SSO)char* _Ptr;         // 长字符串指针
    } _Bx;                  // 16字节
    size_t _Mysize;         // 4字节:字符串长度
    size_t _Myres;          // 4字节:容量
    _Container_proxy* _Proxy;// 4字节:调试信息(仅Debug)
  • Release 模式:24 字节(移除 _Proxy 和填充)
    SSO 容量:15 字符 + \0(存于 _Buf[16])。

(2) GCC
  • 所有模式:12 字节

    cpp

    struct {char* _M_p;         // 堆指针或短字符串数据(前4字节)size_t _M_length;   // 4字节:长度(低1字节表示,最大为15) + 字符(高3字节)size_t _M_capacity; // 4字节:字符或容量
    };

    SSO 容量:15 字符+ \0(复用所有字段存储,并且会突破结构体边界来写入)。


2. 核心差异

特性MSVCGCC
SSO 缓冲区固定 _Buf[16]复用 _M_p_M_length_M_capacity
内存占用(32位)Debug 28B / Release 24B固定12B
越界风险无(严格边界)有(12字节存16字节数据)
设计目标调试友好、稳定性极致性能、内存效率
长度存储显式 _Mysize 字段_M_length 低字节 + 高位标志

3. SSO 优化对比

编译器短字符串存储方式最大短字符串长度
MSVC独立 _Buf[16]15 + \0
GCC复用所有字段,\0 嵌入未用空间15 + \0
  • MSVC:安全但内存占用大。

  • GCC:高风险高回报,性能极致优化。

http://www.xdnf.cn/news/3701.html

相关文章:

  • 华为云Astro轻应用自定义连接器对接OBS云对象存储操作指南
  • No qualifying bean of type ‘XXX‘ available
  • AVInputFormat 再分析
  • 青少年ctf练习平台--做题wp(1)
  • 第九章:反击的序曲(续)
  • C++/SDL 进阶游戏开发 —— 双人塔防(代号:村庄保卫战 19)
  • IP伪装、代理池与分布式爬虫
  • 探索内容智能化的关键解决方案
  • java学习之数据结构:二、链表
  • 模拟SIP终端向Freeswitch注册用户
  • ES6入门---第二单元 模块二:关于数组新增
  • 工业传动核心部件深度剖析:丝杆升降机与气缸的技术特性及选型指南
  • MCP多智能体消息传递机制(Message Passing Between Agents)
  • c#数据结构 线性表篇 非常用线性集合总结
  • springboot基于推荐算法的景点推荐系统(源码+lw+部署文档+讲解),源码可白嫖!
  • 20:深度学习-多层感知器原理
  • Android 端如何监控 ANR、Crash、OOM 等严重问题
  • 深度学习系统学习系列【2】之人工神经网络(ANN)
  • Javase 基础入门 —— 07 接口
  • ChatGPT:重塑人工智能交互范式的破晓之作
  • 【AI论文】交互式生成视频综述
  • 【libuv】基于libuv的exe链接错误
  • JVM——JVM 是如何处理异常的?
  • 传奇各版本迭代时间及内容变化,屠龙/嗜魂法杖/逍遥扇第一次出现的时间和版本
  • Linux53 百度网盘运行(下载devtoolset11后仍提示stdc++3.0.29缺失 计划用docker容器隔离运行,计划后续再看)
  • 鼠标悬浮特效:常见6种背景类悬浮特效
  • Docker与WSL2如何清理
  • 一篇文章看懂web服务
  • NV203NV207SSD固态闪存NV208NV213
  • NoxLucky:个性化动态桌面,打造独一无二的手机体验