Hơi ngạc nhiên (với tôi), hai chương trình sau biên dịch để đầu ra khác nhau, với một thứ hai có hiệu suất tốt hơn (thử nghiệm với gcc và kêu vang):tự động tối ưu hóa Xvalue
#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;
}
}
vs
#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);
}
}
có thể ai đó giải thích cho tôi lý do tại sao các trình biên dịch không (hoặc có thể) không tự động xem xét b
một Xvalue trong việc bố trí cuối cùng và áp dụng ngữ nghĩa di chuyển mà không có sự rõ ràng std::move
dàn diễn viên?
Sửa: Biên soạn với (g++|clang++) -std=c++11 -O3 -o test test.cpp
Các tham số bạn đang chuyển đến trình biên dịch là gì? – Joe
Đoán đầu tiên của tôi là điều này sẽ thay đổi ngữ nghĩa của chương trình theo cách bất ngờ chuyển bản sao thành một động tác. – pmr
@pmr: Đó cũng là điều tôi nghi ngờ, nhưng tôi thực sự muốn hiểu tại sao. Naively, nó có vẻ chính xác như những gì một xvalue nên được cho tôi. – Xoph