-3

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

代码 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";

并且可以释放之前的值使用的内存来添加一个新的吗?

感谢您能帮助我理解这一点:)

4

3 回答 3

2

如果是:

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

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

如果是:

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

当 blah 太大以适合结果的当前缓冲区时,字符串实现可能能够通过仅重新分配来优化一些堆分配和解除分配。

var=x 和 var.assign(x) 应该产生相同的代码;无论哪种方式,我都不希望有实质性的差异。

于 2012-10-27T21:37:59.223 回答
1

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

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

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

于 2012-10-28T00:44:40.853 回答
1

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

于 2012-10-27T21:38:17.333 回答