【发布时间】:2014-12-03 16:21:25
【问题描述】:
如果我使用std::ostringstream 构造一个由空格分隔的浮点值列表组成的字符串:
std::ostringstream ss;
unsigned int s = floatData.size();
for(unsigned int i=0;i<s;i++)
{
ss << floatData[i] << " ";
}
然后我在std::string 中得到结果:
std::string textValues(ss.str());
但是,这将导致不必要的字符串内容的深层复制,因为ss 将不再被使用。
有什么方法可以在不复制整个内容的情况下构造字符串?
【问题讨论】:
-
你确定这是复制吗?我认为这是应用 RVO 的一个完全合理的案例。检查你的程序集,看看你的编译器在做什么。
-
@Manu343726 RVO 适用于
return值。这里没有return。 -
标准关于 str() 的说法是:“返回一个带有流当前内容副本的字符串对象。”所以是的,它复制了
-
作为 QoI,一个实现可以用
move(ss).str()做一些好事,但我不知道现在有没有。 -
@galinette 是的,你可以,虽然我认为大多数编译器都不能很好地支持。
标签: c++ c++11 move-semantics ostringstream