2016-07-01 21 views
11

Giả sử chúng tôi có một lớp học Foo với một nhà xây dựng không phải là explicit từ một số int. Sau đó, cho các chức năng sau:Xây dựng trong báo cáo trả lại

Foo makeFoo1() { return 123; } 
Foo makeFoo2() { return {123}; } 

Tôi nghĩ makeFoo1 đòi hỏi Foo 's sao chép/di chuyển ctor có thể truy cập, và đó là thể (mặc dù không chắc) mà trình biên dịch không bõ mẫu âm chót sao chép và do đó kết quả trong một sao chép/di chuyển đúng.

Đối với makeFoo2, vì chúng tôi đang sử dụng tính năng khởi tạo danh sách sao chép, không có bản sao/di chuyển nào có thể xảy ra.

Tôi có nên thực sự lo lắng về điều này và đặt các đối số cho các sốctors trong niềng răng bất cứ khi nào tôi có thể (như trong makeFoo2)? (Nói nếu tôi là tác giả thư viện và mong muốn thư viện được sử dụng với các trình biên dịch phụ cho hệ thống nhúng.)

+1

_ "Đối với makeFoo2, vì chúng tôi đang sử dụng sao chép danh sách-bản sao, không sao chép/di chuyển nào có thể xảy ra." _ [Thật sao?] (Http://stackoverflow.com/q/38043288/560648) –

+2

Không, tuy nhiên makeFoo thứ hai có yêu cầu thấp hơn đối với lớp Foo (không có bản sao nào); do đó nó là tốt hơn. –

+1

Bản sao nào bạn đang cố gắng bỏ trốn? Nếu bạn đang xây dựng từ một số nguyên, tôi sẽ không lo lắng về việc sao chép eliding một số nguyên như thế này sẽ phù hợp với một thanh ghi CPU. Đối với các đối tượng Foo, sẽ không được elided đã được bởi RVO? – Spacemoose

Trả lời

3

Tôi sẽ đi ra ngoài và kết hợp câu trả lời thực tế với biện minh luật pháp yếu.

Đối số luật sư ngôn ngữ yếu: Nếu tôi hiểu this cppreference.com description chính xác, bạn không được đảm bảo RVO khi khởi tạo với danh sách khởi tạo (makeFoo2) bất kỳ chi tiết nào bạn chỉ có trả lại (makeFoo1). Vì vậy, không bao quanh int của bạn trong niềng răng.

Đối số thực tế 1: Hãy đến một, các dấu ngoặc nhọn đó có bị là không cần thiết. Họ nên không cần thiết. Vì vậy, không sử dụng chúng, nó không có vẻ đúng.

Đối số thực tế 2: Nguyên tắc ít gây ngạc nhiên nhất. Sử dụng những niềng răng, bạn đang ngụ ý có cái gì đó sai trái với hình thức cú đúp. Tôi sẽ bối rối và hơi ngạc nhiên bởi niềng răng (mặc dù không phải là rất bối rối).

Đối số thực tế 3: Trong các trường hợp này - hãy tin cậy trình biên dịch. Đây không phải là nơi nút cổ chai hiệu suất của bạn (và nếu nó là - làm cho nó trở thành một hàm nội tuyến, và nó sẽ không có; hoặc sử dụng một tham chiếu nếu bạn có một đối tượng hiện có; vv).

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