【发布时间】:2014-11-18 17:27:21
【问题描述】:
有点令人惊讶(对我来说),以下两个程序编译成不同的输出,后一个具有更好的性能(用 gcc 和 clang 测试):
#include <vector>
int main()
{
std::vector<int> a(2<<20);
for(std::size_t i = 0; i != 1000; ++i) {
std::vector<int> b(2<<20);
a = b;
}
}
对比
#include <vector>
int main()
{
std::vector<int> a(2<<20);
for(std::size_t i = 0; i != 1000; ++i) {
std::vector<int> b(2<<20);
a = std::move(b);
}
}
有人可以向我解释为什么编译器会(或不能)在最后一个赋值中自动考虑 b 一个 xvalue 并在没有显式 std::move 强制转换的情况下应用移动语义吗?
编辑:使用(g++|clang++) -std=c++11 -O3 -o test test.cpp编译
【问题讨论】:
-
你传递给编译器的参数是什么?
-
我的第一个猜测是,这会以意想不到的方式改变程序的语义,将复制变成移动。
-
@pmr:这也是我的怀疑,但我真的很想了解原因。天真地,它看起来确实像 xvalue 对我来说应该是什么。
-
确实它可能是一种优化,但它肯定会影响程序本身的语义,即更改所有权。 IIRC 在第一个标准草案期间对此主题进行了很多讨论
-
编译器只是安全的,在这种情况下它确实可以工作,但似乎编译器在 std 进行优化时没有使用“b 将不再被使用”的信息: :move 明确地告诉他
标签: c++ c++11 move-semantics xvalue