2013-05-17 21 views
5

Trong các lớp học của tôi, tôi sử dụng std::vector v.v ... như các biến thành viên, đi kèm với các nhà xây dựng di chuyển của riêng họ. Tôi không khai báo một cách rõ ràng các hàm khởi tạo cho các lớp của tôi và chúng không được khai báo ngầm cho hầu hết các phần.Biến thành viên trong các đối tượng tạm thời có được di chuyển hoàn toàn khi có thể không?

Nếu trình tạo bản sao ngầm định hoặc toán tử gán ngầm của lớp của tôi được gọi với giá trị rvalue, các thành viên đã di chuyển sao chép hoặc di chuyển chưa?

Nếu chúng được di chuyển, có bất kỳ lý do gì để cố gắng tránh các thời gian tạm thời khi sử dụng các lớp học với các thành viên có khả năng di chuyển không?

+0

Nếu sử dụng C++ 11, chúng sẽ được di chuyển, nếu C++ 03 chúng sẽ được sao chép. Từ C++ 11, tất cả các lớp chứa thư viện chuẩn sẽ tận dụng các ngữ nghĩa di chuyển. –

+0

Nhưng điều này sẽ không phải là trường hợp nếu tôi tuyên bố rõ ràng một nhà xây dựng sao chép phải không? Theo như tôi biết, việc gắn một tham chiếu const vào một giá trị và sau đó gán nội dung sẽ không cho phép các toán tử gán di chuyển của các thành viên được sử dụng. – gokturk

+0

_ "chúng không được khai báo hoàn toàn cho phần lớn." _ Thì kiểu của bạn không có ngữ nghĩa di chuyển, vì vậy không có cách nào cho các thành viên được di chuyển –

Trả lời

0

Trình tạo bản sao của bạn chỉ có một chữ ký cho dù được tạo ngầm hoặc khai báo rõ ràng, do đó không có cách nào để trình biên dịch tạo mã khác tùy thuộc vào toán hạng bên phải của hàm tạo đó. Nó để sao chép các thuộc tính có thể di chuyển trong mọi trường hợp, bởi vì hàm tạo bản sao chỉ có một bộ mã phải hoạt động cho tất cả các đầu vào có thể.

Tôi nghĩ câu hỏi cuối cùng của bạn có thể liên quan đến hiệu suất nhưng tôi không thể chắc chắn. Những gì tôi sẽ đề nghị là bạn viết mã rõ ràng nhất và để cho trình tối ưu hóa có một vết nứt ở đó. Sau đó, hồ sơ các kết quả và xem liệu nó có cho thấy việc tạo và hủy tạm thời đang gây ra vấn đề cho bạn hay không và chỉ khi nào bạn nên xem xét các cơ chế thay thế.

4

Nếu lớp của bạn không khai báo một cách rõ ràng một toán tử khởi tạo/gán và chúng không được khai báo ngầm, thì hàm ctor/assignment-op sao chép ngầm sẽ không di chuyển thành viên, nhưng sao chép chúng.

Chúng sẽ được di chuyển nếu di chuyển ctor/assignment-op được khai báo ngầm định cho lớp của bạn. Bạn nói họ không - tại sao vậy? Do các lớp học của bạn có destructors tùy chỉnh? Bạn nên cố gắng cho một thiết kế mà bạn không cần một dtor tùy chỉnh, copy/move ctor và copy/move assignment op - đôi khi được gọi là "Rule of zero".

Nếu bạn cần một dtor tùy chỉnh, bạn nên khai báo di chuyển ctor/assignment-op một cách rõ ràng để sử dụng ngữ nghĩa di chuyển. Nếu trình biên dịch của bạn hỗ trợ nó, bạn có thể khai báo chúng như là mặc định.

+0

"Nếu trình biên dịch của bạn hỗ trợ nó, bạn có thể khai báo chúng như mặc định. " Đó không phải là một ý tưởng tồi trong hầu hết các trường hợp (quy tắc năm)? – dyp

+0

"Bạn nói họ không phải - tại sao vậy?" Có, hầu hết đều có destructors. – gokturk

+1

@DyP Lớp học trong câu hỏi dường như có các ctors sao chép được định nghĩa ngầm, vì vậy nó đã bị hỏng, hoặc dtor chỉ làm những thứ không ảnh hưởng đến việc di chuyển mặc định - chẳng hạn như ghi nhật ký gì đó. – Angew

Các vấn đề liên quan