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
相关产品推荐
相关产品推荐

