C++ std::string 的 + 运算符返回新临时对象,不修改原字符串;连续拼接如 a+b+c 会构造多个中间对象,导致重复内存分配与拷贝,性能较差。
直接说结论:
C++
的
运算符是重载函数,它不修改左操作数,而是返回一个**新构造的临时
对象**;连续用
拼接多个字符串时,会产生多个中间临时对象,性能可能较差。
为什么
效率不高?
因为
是非成员函数(或友元),签名类似:
每次调用都分配新内存、拷贝内容、构造新对象。例如:
这在循环内或高频拼接场景下会明显拖慢速度。
哪些拼接方式更高效?
根据使用场景选择:
已知所有片段且数量少 → 用
或
:复用同一对象内存,避免重复分配
拼接片段多、长度可预估 → 先调用
再
:减少内存重分配次数
C++20 起可考虑
(如
),语义清晰且实现通常做了优化
若需极致性能(如日志拼接)→ 用
配合自定义缓冲区,或转向
(但注意其内部也有开销)
和
的关键区别在哪?
根本差异在于是否修改左操作数:
立即学习
“
C++免费学习笔记(深入)
”;
C函数速查手册(CHM版)
C函数速查手册(CHM版)
下载
:返回新对象,
和
均不变
:直接在
的内部缓冲区追加内容(可能触发一次
),不产生额外临时对象
是
的成员函数,支持右值引用重载(C++11 起),对临时对象能自动移动,比如
中的右侧临时串会被移动而非拷贝
容易被忽略的
隐式转换
陷阱
写
会编译失败——因为字面量
是
,而
没有接受
作左操作数的重载(只有右操作数支持)。正确写法是:
✅(
在左,有对应重载)
✅(显式构造)
✅(C++14 起,
是
字面量)
这个限制常导致初学者困惑,本质是重载函数参数匹配规则决定的,不是语法缺陷。
真正要注意的是:别在性能敏感路径里无脑链式
,也别假设编译器会自动把
优化成
——它不会。临时对象的生命周期和内存行为是确定的,得自己控制。
std::string+std::string+str1 + str2 + str3operator+std::string operator+(const std::string& lhs, const std::string& rhs)std::string a = "hello";
std::string b = "world";
std::string c = "!";
std::string s = a + b + c; // 等价于 operator+(operator+(a, b), c)
// 先构造 tmp1 = a+b,再构造 tmp2 = tmp1+c,tmp1 被立即销毁std::string::append()+=reserve()+=std::format()std::format("{}{}{}", a, b, c)std::string_viewstd::ostringstream++=a + baba += barealloc+=std::strings += std::string("x") + "y""hello" + s"hello"const char*operator+const char*s + "hello"std::stringstd::string("hello") + s"hello"s + s"hello"sstd::string+++=