You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++基类中std::string与char*的差异:冗余拷贝问题解析

为啥类里用std::string会产生冗余拷贝,const char*却不会?

嘿,这个问题我太懂了!咱们掰开揉碎了说清楚:

先看你提到的代码场景——Animal类里的m_speak如果是const char*,和换成std::string的区别,核心就在两者存储字符串的逻辑完全不一样:

先说const char*的情况

  • const char*本质是个指针变量,它存的是字符串字面量(比如"woof"、"meow"这种)在内存里的地址。
  • 字符串字面量是存在程序的只读数据段里的,整个程序运行期间只有一份拷贝。不管你创建多少个Animal的子类对象(比如Dog、Cat),它们的m_speak指针都指向同一个地址,不会复制字符串内容本身。每个对象里的m_speak只占指针的大小(4字节或8字节,取决于系统),完全没冗余。

再看std::string的情况

  • std::string是个类对象,它的设计是自己管理字符串内容。当你给它赋值一个字符串字面量时,它会把这份字符串内容拷贝一份到自己的内存空间里(要么是对象内部的小缓冲区,要么是堆上分配的内存)。
  • 也就是说,哪怕1000个Cat对象的m_speak都是"meow",每个Cat对象里的std::string都会单独存一份"meow"的字符数据——这就造成了完全没必要的冗余拷贝,平白浪费内存。

补充一句:虽然现在不少std::string实现有小字符串优化(SSO),短字符串会存在对象内部的缓冲区里,但就算这样,每个std::string对象还是会存一份字符串内容,只是不用堆分配罢了,冗余还是存在的。


内容的提问来源于stack exchange,提问作者arcoxia tom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:43:18