有人想解释一下哪个代码更快?什么是优化字符串赋值的最佳方法?
代码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";
并且可以在添加新值之前释放该值使用的内存吗?
谢谢你能帮我理解:)
答案 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=
的实现可能与上面针对某些字符串库的描述不同,因此最好的建议是针对您的环境对其进行测试。