Chỉ cần làm rõ "bản sao bổ sung" @ecatmur mô tả, nếu push_back
nhận được đối số của nó theo giá trị, điều sẽ xảy ra là bạn sẽ bắt đầu với đối tượng của mình. Một bản sao đó sẽ được chuyển đến push_back
làm thông số của nó. Sau đó, push_back
sẽ tạo một bản sao của rằng để đưa vào chính vectơ.
Vì việc triển khai thực tế push_back
nhận đối số của nó bằng tham chiếu, nó (push_back
) tạo đối tượng mới trong vectơ trực tiếp dưới dạng bản sao đối tượng gốc của bạn. Như đã đề cập, có, với C++ 11 sử dụng ngữ nghĩa di chuyển, nó sẽ có thể (mặc dù có lẽ không đặc biệt thuận lợi) để chuyển đối số theo giá trị, và sau đó di chuyển giá trị từ đối số đó vào đối tượng mới trong vectơ. Nếu những gì bạn đặt trong vectơ là, một chuỗi chỉ chứa một con trỏ và một vài trường "giữ sách" (lượng bộ nhớ được phân bổ, lượng bộ nhớ hiện đang sử dụng), sẽ là gần như là hiệu quả khi chuyển một tham chiếu, bởi vì một động tác chỉ có thể làm một bản sao nông - sao chép con trỏ và tự giữ các giá trị, thay vì tất cả các dữ liệu mà nó trỏ vào. Tuy nhiên, nếu đối tượng được đề cập giữ tất cả dữ liệu của nó trực tiếp (tức là, không phải là một con trỏ), thì di chuyển sẽ chậm như một bản sao.
Chuyển qua tham chiếu, tránh tất cả sao chép đó, vì vậy ngay cả đối với nội dung nào đó như chuỗi, nó vẫn nhanh hơn (đối với trường hợp như vậy đối tượng gốc không thể bị vô hiệu). Nó cũng có lợi thế nhỏ khi làm việc với C++ 98/03, không chỉ C++ 11.
Nguồn
2012-08-01 15:44:07
Tôi sẽ làm điều đó. Tôi nhận ra nó chỉ ngày hôm qua và tôi đang làm nó từ đó trở đi. Cảm ơn bạn! – sachin2182