2011-06-26 30 views
10

Trước khi ai đó nhảy và nói Profile before optimize!, đây chỉ đơn giản là một câu hỏi tò mò và bắt nguồn từ this original question.Trình biên dịch C++ có tối ưu hóa giá trị trả về không sử dụng bằng `tham chiếu` không?

Nếu tôi trở lại bằng cách tham chiếu cùng một đối tượng, liệu nó có được tối ưu hóa đi nếu không được sử dụng không? Ví dụ, tôi có một Vector<> có các hàm toán học khác nhau (giả sử tôi không sử dụng toán tử quá tải). Hai cách viết nó:

inline void Vector::Add(const Vector& in) // Adds incoming vector to this vector 

HOẶC

inline Vector& Vector::Add(const Vector& in) // Adds incoming vector to this vector and returns a reference to this vector 

Bây giờ nếu Add() được sử dụng mà không cần sử dụng giá trị trả về, sẽ trình biên dịch chỉ đơn giản là vứt bỏ sự trở lại hoàn toàn và chức năng trở nên như thể nó không có giá trị trả về để bắt đầu bằng? Và nếu nó KHÔNG là inlined thì sao?

Trả lời

11

Tham chiếu dưới dạng đối số hoặc câu lệnh trả về thường được thực hiện theo cách tương tự như con trỏ và chi phí là tối thiểu (không đáng kể trong hầu hết trường hợp). Tùy thuộc vào quy ước gọi điện, nó có thể là một cửa hàng duy nhất trong sổ đăng ký.

Để xem liệu trở về có thể được tối ưu hóa đi, trừ khi trình biên dịch là nội tuyến mã không, nó không thể. Khi trình biên dịch xử lý chức năng, nó không biết liệu mã gọi có sử dụng hay không câu lệnh trả về, và điều đó có nghĩa là nó phải luôn luôn trả lại một cái gì đó.

+0

+1, một câu trả lời hay khác như mọi khi :) –

+2

Điều này giả định trình biên dịch sẽ xử lý hàm một lần thay vì xử lý nó mỗi khi được gọi. Nhiều trình biên dịch hiện đại làm (hoặc có thể được cấu hình để làm) sau này. Một trong những lý do họ làm như vậy là cho phép chính xác loại tối ưu hóa này. –

+0

"trừ khi trình biên dịch inlining mã không" - có nghĩa là 'ngày nay, với LTO, tất cả các mã không chia sẻ-đối tượng có thể được inlined, vì vậy có lẽ có' :-) –

4

Nếu chức năng không được gạch chân, thì có giá trị trả về phải được lưu ở đâu đó, có thể là thanh ghi CPU. Điều này có lẽ chỉ cần một bản sao đăng ký duy nhất. Tôi sẽ ngạc nhiên nếu chi phí vượt quá một chu kỳ CPU trong hầu hết các trường hợp.

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