为什么std :: string的复制构造函数似乎比移动对应的更快?

时间:2017-08-26 12:33:04

标签: c++ c++11 move-semantics

我正在尝试学习移动语义,并且我读到移动可能比复制更快。但是,我看到以下琐碎的代码完全相反:

for (int i = 0; i < 100000000; ++i) {
    std::string a("Copy");
    std::string b = a;
}

for (int i = 0; i < 100000000; ++i) {
    std::string a("Move");
    std::string b = std::move(a);
}

这是我的mac上的时间:

$ time ./copy.out
real    0m2.511s
user    0m2.481s
sys     0m0.011s


$ time ./move.out
real    0m3.993s
user    0m3.933s
sys     0m0.020s

1 个答案:

答案 0 :(得分:0)

正如其中一条评论所暗示的那样,大多数库实现都进行了短串优化&#34;,SSO,其中对于足够短的字符串(某个特定长度,对于给定的实现),整个字符串都存储起来在字符串对象的主体中,在堆栈上。当您的数据完全存储在堆栈中时,移动与复制相同。我所知道的所有实现都会将一个4字符的字符串标记为SSO,因此无论您是移动还是复制它都是相同的操作。

如果输出sizeof(sring)的结果,请选择大于该值的字符串,并对两种情况使用相同的字符串。还要确保优化已开启。

这种微观基准的方法并不是那么好。通常更好的是在定时区域之外随机化数据,然后在定时的循环中执行操作。使用相同的常量数据通常会导致疯狂的编译器优化,从而使结果无效。