什么是移动语义
string类型的变量使用 += 运算符和使用 + 运算符然后传递给自身之间的的性能是否有差距呢,我们来测试以下,代码如下:
#include <iostream>
#include <string>
#include <chrono>
void foo1(int n)
{
std::string s1 = "helloworld";
std::string s;
for(auto i = 0;i!=n;i++)
{
for(int j = 0;j<10;j++)
{
s+=s1[j];
}
}
}
void foo2(int n)
{
std::string s2 = "helloworld";
std::string s;
for(auto i = 0;i!=n;i++)
{
for(int j = 0;j<10;j++)
{
s = s+s2[j];
}
}
}
int main()
{
auto start = std::chrono::high_resolution_clock::now();
//foo1(100000000);
foo2(30000);
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> dur = end - start;
//std::cout<<"The time of foo1(100000000) is "<<dur.count()<<std::endl;
std::cout<<"The time of foo2(30000) is "<<dur.count()<<std::endl;
return 0;
}
我们可以看到foo1使用+=运算符,foo2使用+然后传给自身,那么差距是多少呢,由于差距太大,采用同样的n会导致大的过大或者小的过小,我们将foo1的n值设置为100000000,foo2的n值设置为30000,结果如下:
可见在foo1循环次数远超foo2的情况下花费的时间还是少于foo2。那么为什么会造成如此巨大的性能差距呢,这个就不得而知了,但是我猜测应该与移动语义有关系。