Có 2 đối tượng trong chính: A a,b;
, một đối tượng trong cơ thể của chức năng f()
: A b;
và sau đó là đối tượng tạm thời đang được sao chép và bản sao của nó được lưu trữ vào b
.
Khi trả về b
trong phần chức năng của bạn, bản sao được tạo lúc đầu, sau đó địa chỉ b
bị hủy, sau đó sao chép được gán vào biến b
được khai báo chính và sau đó bản sao này bị hủy.
Add sau dòng đến lớp A
nét và nhìn thấy mình:
A(const A&) { cout << "copying" << endl; }
Với Named Return Value Optimization, trình biên dịch cố gắng để loại bỏ dư thừa constructor Sao chép và Destructor gọi có nghĩa là địa phương b
từ chức năng f()
sẽ được chỉ định thành biến số b
trong chính mà không cần sao chép. Vì vậy, với RVO/NRVO chỉ có 3 đối tượng được tạo trong trường hợp của bạn.
Mặc dù có một cách làm thế nào để tránh huỷ bản sao này mà không RVO trong trường hợp của bạn:
A a;
A b = a.f();
trong trường hợp này bản sao của giá trị trả về của hàm f()
được tạo ra và lưu trữ như là một biến b
. Điều này cũng có nghĩa là không có nhà điều hành phụ trách nào được gọi và chỉ có 2 đối tượng được tạo trong chính: a
và bản sao của b
được trả về bởi f()
.
Hy vọng điều này sẽ hữu ích.
Không, không. http://ideone.com/ywGdo –
Rất tiếc! Tôi đã sử dụng Codepad .. http://codepad.org/1OJGoYGP – Venky
Đừng gắn thẻ các câu hỏi của bạn với "c" khi chúng nói về C++. Các ngôn ngữ không giống nhau. – tinman