Ngoài những gì du khách nói:
Chức năng void emplace_back(Type&& _Val)
được cung cấp bởi MSCV10 là không phù hợp và dự phòng, vì như bạn đã lưu ý, nó hoàn toàn tương đương với push_back(Type&& _Val)
.
Nhưng dạng C ++ 0x emplace_back
thực sự rất hữu ích : void emplace_back(Args&&...)
;
Thay vì lấy một value_type
danh sách các đối số có tính đột biến, điều đó có nghĩa là bây giờ bạn có thể chuyển tiếp hoàn hảo các đối số và xây dựng trực tiếp một đối tượng vào một thùng chứa mà không cần tạm thời.
Điều đó hữu ích bởi vì cho dù RVO có thông minh đến mức nào và di chuyển ngữ nghĩa mang đến bàn thì vẫn có những trường hợp phức tạp trong đó một Push_back có khả năng tạo ra các bản sao không cần thiết (hoặc di chuyển). Ví dụ, với insert()
chức năng truyền thống của a std::map
, bạn phải tạo tạm thời, sau đó sẽ được sao chép vào a std::pair<Key, Value>
, sau đó sẽ được sao chép vào bản đồ:
std::map<int, Complicated> m;
int anInt = 4;
double aDouble = 5.0;
std::string aString = "C++";
// cross your finger so that the optimizer is really good
m.insert(std::make_pair(4, Complicated(anInt, aDouble, aString)));
// should be easier for the optimizer
m.emplace(4, anInt, aDouble, aString);
Vậy tại sao họ không triển khai đúng phiên bản emplace_back trong MSVC? Trên thực tế, nó đã làm tôi thất vọng một thời gian trước đây, vì vậy tôi đã hỏi cùng một câu hỏi trên blog Visual C ++ . Dưới đây là câu trả lời từ Stephan T Lavavej, người duy trì chính thức triển khai thư viện chuẩn Visual C ++ tại Microsoft.
H: Hiện tại các chức năng của beta 2 chỉ là một loại giữ chỗ nào đó phải không?
Trả lời: Như bạn có thể biết, các mẫu từ khóa không được triển khai trong VC10. Chúng tôi mô phỏng chúng với máy móc tiền xử lý cho những thứ như
make_shared<T>()
, tuple và những thứ mới trong <functional>
. Máy móc tiền xử lý này tương đối khó sử dụng và bảo trì. Ngoài ra, nó ảnh hưởng đáng kể đến tốc độ biên dịch, vì chúng ta phải liên tục bao gồm các tiêu đề phụ. Do sự kết hợp giữa các hạn chế về thời gian và các mối quan tâm về tốc độ biên dịch, chúng tôi đã không mô phỏng các mẫu biến đổi trong các hàm của chúng tôi.
Khi các mẫu matrixdic được triển khai trong trình biên dịch, bạn có thể mong đợi rằng chúng ta sẽ tận dụng chúng trong các thư viện, bao gồm cả các hàm emplace của chúng ta. Chúng tôi rất coi trọng sự phù hợp, nhưng thật không may, chúng tôi không thể làm tất cả mọi thứ cùng một lúc.
Đó là một quyết định dễ hiểu. Tất cả những người đã thử chỉ một lần để mô phỏng khuôn mẫu dao động với các thủ thuật khủng khiếp tiền xử lý đều biết công cụ này kinh tởm đến mức nào.