C++ 构造用于追加的字符串

C++ 构造用于追加的字符串,c++,c++11,C++,C++11,我必须通过连接其他几个字符串来构造一个字符串。我还知道字符串的最大大小,我想保留容量,这样就不会重新分配。我现在的代码如下所示: #include <string> using std::string; // Setup ... string a,b,c; // Strings are filled with relevant data ... string msg; msg.reserve(200); msg = "A="; msg += a; msg += ','; m

我必须通过连接其他几个字符串来构造一个字符串。我还知道字符串的最大大小,我想保留容量,这样就不会重新分配。我现在的代码如下所示:

#include <string>
using std::string;

// Setup
...

string a,b,c;

// Strings are filled with relevant data
...

string msg;
msg.reserve(200);
msg = "A=";  msg += a; msg += ',';
msg += "B="; msg += b; msg += ',';
msg += "C="; msg += c; msg += '.';
#包括
使用std::string;
//设置
...
字符串a、b、c;
//字符串由相关数据填充
...
串味精;
味精储备(200);
msg=“A=”;msg+=a;味精+=',';
msg+=“B=”;msg+=b;味精+=',';
msg+=“C=”;msg+=c;味精+=';
我以前为此使用了
stringstream
,但性能慢了一倍。 有没有办法在构造时保留字符串容量,而不必分配两次内存?还有更好(更快)的附加字符串的方法吗

有没有办法在构造时保留字符串容量,而不必分配两次内存

这里没有“分配内存两次”。您正确地创建了一个字符串,然后要求它保留一些内存。除了保留更准确的金额(而不仅仅是猜测
200
),您还可以

从技术上讲,您可能看到的是小字符串优化的结果(在
std::string本身中静态分配的缓冲区,以避免在某些情况下动态分配),而不是使用此功能


如果你真的关心它,你可以用200个
\0
字符来实例化这个字符串,然后把它们全部删除;然后它的底层容量将保持一致。

此代码不会分配两次。默认构造函数不分配任何内存。@SebastianRedl对象本身必须位于内存中的某个位置。我认为实际字符串的内存与对象的内存是连续的,如果可以在construction@EyalK. 我在@SebastianRedl
std::string
中没有看到类似的东西,它倾向于分配一些内存,即使是用于默认构造@艾尔克:在您的示例中,对象具有自动存储,公共实现将为它们使用堆栈,而实际的字符串内存具有动态存储,公共实现将它们放入堆中。所以让实际字符串的内存与对象的内存相邻是很少见的…好的,谢谢。那我构造字符串的方式呢?我觉得必须有更有效的方法来做这件事(我需要尽快发布这些信息)@EyalK.:别担心。完成你的程序,然后对这个函数进行基准测试,看看你是否需要改进它。但是你可能没有。这个函数并不是处于一个紧密的循环中,但它确实参与了一种与竞争对手消息的“竞赛”。它不会出现在评测中,但它确实需要尽可能快地赢得测试race@EyalK. 然后重新设计你的程序,这样你就不会有数据竞赛了?@EyalK.:这很可能对竞赛结果没有明显的影响。它非常非常快,比网络I/O功能快得多。在您花费更多时间进行微优化之前,请先进行配置。