2009-03-20 35 views
6

Trong một previous question, xuất hiện hàm đồng trả theo giá trị luôn sao chép đối số return của nó vào biến được gán từ nó.Sao chép hàm tạo và tối ưu hóa giá trị trả về

Đây có phải là yêu cầu của tiêu chuẩn hoặc chức năng có thể được tối ưu hóa bằng cách xây dựng biến 'được gán cho' ngay cả trong nội dung hàm không?

struct C { int i; double d; }; 

C f(int i, int d) { 
    return C(i,d); // construct _and_ copy-construct? 
} 

int main() { 
    C c = f(1, 2); 
} 

Trả lời

7

Các tiêu chuẩn cho phép bất kỳ mức độ sao chép thiếu sót ở đây:

  • xây dựng tạm thời tại địa phương, sao chép-xây dựng nó thành một giá trị trả về, và sao chép-xây dựng các giá trị trả về vào địa phương "c". HOẶC
  • xây dựng tạm thời địa phương và sao chép cấu trúc đó thành "c". HOẶC
  • xây dựng "c" với các đối số "i, d"
+0

Bạn có thể cung cấp số phần từ tiêu chuẩn không? –

+0

Điều tương tự mà Neil đã đăng: 12.15. Bạn có diễn giải nó khác nhau không? –

7

Tiêu chuẩn nói rằng các nhà xây dựng bản sao không cần phải được sử dụng - xem phần 12,8/15:

15 Bất cứ khi nào một đối tượng lớp tạm thời được sao chép sử dụng một constructor sao chép, và đối tượng này và bản sao có loại cùng loại cv không đủ điều kiện, việc triển khai được phép xử lý bản gốc và bản sao dưới dạng hai các cách khác nhau tham chiếu đến cùng một đối tượng và không thực hiện bản sao tại tất cả, ngay cả khi lớp học sao chép constructor hoặc destructor có bên hiệu ứng.

Và nhiều hơn nữa trong một mạch tương tự.

+0

12.5 trong tiêu chuẩn năm 1998 của tôi là "Cửa hàng miễn phí" để bạn tham khảo một số tiêu chuẩn khác? –

+0

Nên có 12.8/15 –

-1

Có một cách rất đơn giản và tốt để tránh cân nhắc như vậy hoàn toàn - bạn có thể xem xét việc trả lại một tăng :: shared_ptr đến đối tượng tạo - nó sẽ được thực tế giống nhau khi nói đến khả năng sử dụng nhưng đối tượng của bạn chắc chắn sẽ không được sao chép không cần thiết - và nó sẽ là đúng cũng nếu bạn trả lại nó mặc dù một vài lớp của các cuộc gọi chức năng.

+0

nó không phải là một tốt để shared_ptr std :: string hoặc std :: pair hoặc std :: vector. –

+0

Để tránh sao chép-xây dựng, tôi có thể sử dụng heap i.s.o. ngăn xếp bộ nhớ. Tôi biết rằng:)/ Nhưng tôi muốn biết liệu tôi có thể tin tưởng trình biên dịch hay không, tức là tiêu chuẩn để _guarantee_ gọi hàm tạo bản sao của tôi. Mà tôi không thể. – xtofl

+0

tò mò: tại sao bạn cần đảm bảo này dù sao xtof? –

0

Cách không chuyển tham số bằng tham chiếu và gán kết quả cho nó?

+0

vì nó xấu hơn và kém linh hoạt hơn tại trang cuộc gọi. nó chỉ nên được thực hiện ở các điểm quan trọng về hiệu năng. –

+0

Hoặc khi bạn cần nhiều giá trị trả lại (ví dụ: trạng thái và giá trị) – xtofl

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