2012-04-27 28 views
5

xem xét như sau:Trình biên dịch có được phép biến một giá trị lvalue thành tham chiếu rvalue nếu giá trị không còn được sử dụng trong phạm vi xác định của nó không?

ComplexObject foo() 
{ 
    ComplexObject temp; 
    //Do things with temp 
    ComplexObject result(temp, SOME_OTHER_SETTING); //1 
    //Do things with result. Do not use temp at all 
    return result; //2 
} 

ComplexObject foo() 
{ 
    ComplexObject temp; 
    //Do things with temp 
    ComplexObject result(std::move(temp), SOME_OTHER_SETTING); //1 
    //Do things with result. Do not use temp at all 
    return std::move(result); //2 
} 

với giả định rằng ComplexObject có một constructor di chuyển mà còn lâu mới hiệu quả hơn constructor sao chép nó.

Trình biên dịch có được phép chuyển đổi mã đầu tiên thành mã thứ hai một cách hiệu quả không, vì nó biết rằng không thể sử dụng ComplexObject cho phần còn lại của khối đó?

+0

Ngoài ra, 'ComplexObject' có hàm hủy không tầm thường không? –

+0

@BenVoigt: Giả sử nó chứa thứ gì đó như vectơ, vâng. –

Trả lời

3

Không cho temp, nhưng trình biên dịch có thể thực hiện các tối ưu hóa khác theo quy tắc as-if, có thể có cùng tác dụng.

Đối với result, có quy tắc đặc biệt về các câu hỏi return, sẽ sử dụng di chuyển nếu có thể (và ưu tiên được ưu tiên hơn di chuyển hoặc sao chép).

+0

Quy tắc * as-if * sẽ không có hiệu ứng đó. Nếu trình biên dịch không thể nội tuyến các hàm tạo, nó không thể chứng minh chúng không có hiệu ứng phụ quan sát khác nhau và nếu nó có thể, hãy gạch nội dung bản sao và loại bỏ tất cả các lệnh có thể sử dụng * as-if * rule hiệu quả và đã được triển khai. –

+0

@JanHudec: Đó là những gì tôi đã nói trong câu trả lời của tôi. –

+0

Câu đó có một chút sai lệch; "hiệu ứng tương tự" thiếu ngữ cảnh. –

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