std :: string优化?

时间:2012-10-27 21:25:16

标签: c++ string optimization

有人想解释一下哪个代码更快?什么是优化字符串赋值的最佳方法?

代码1:

std::string result;

int main()
{
   for(int i=0;i<1000;i++)
   {
   /*some code*/
   result = stringVar;
   /* some code using result */
   }
}

代码2:

int main()
{
   for(int i=0;i<1000;i++)
   {
   /*some code*/
   std::string result = stringVar;
   /* some code using result */
   }
}

并指定价值:

std::string var;

var.assign("value");
//or
var="value";

并且可以在添加新值之前释放该值使用的内存吗?

谢谢你能帮我理解:)

3 个答案:

答案 0 :(得分:2)

以下情况:

for (...)
    std::string result = blah;

编译器必须每次通过for循环构造和销毁结果,可能需要堆分配和释放调用。

以下情况:

std::string result;
for (...)
    result = blah;

当blah大到适合结果的当前缓冲区时,字符串实现可能只能通过重新分配来优化一些堆分配和释放。

var = x和var.assign(x)应该生成相同的代码;无论如何,我都不希望出现实质性的差异。

答案 1 :(得分:1)

第一个可能有点快,因为它可以重复使用前一个传递中分配的内存;第二个在每次循环结束时销毁字符串,因此释放字符串内容的存储空间。尽管在循环体中定义了对象,但保持对象的优化器违反了语言规则。

答案 2 :(得分:1)

在代码1中,将调用operator=,这通常通过创建临时对象(使用复制构造函数)然后使用lhs对象交换临时对象的内容来实现。因此,在代码1中完成了复制构造函数,交换和临时对象的删除(当方法operator=()退出时)。

在代码2中,调用复制构造函数,最后在for循环传递结束时删除该对象。

因此代码1有额外的步骤来交换字符串类的内容。虽然operator=的实现可能与上面针对某些字符串库的描述不同,因此最好的建议是针对您的环境对其进行测试。