2010-01-21 32 views
9

Tôi đã thấy một số mã trong đó các đối số được truyền cho hàm theo giá trị đang được sửa đổi hoặc gán giá trị mới và đang được sử dụng như biến cục bộ .Sửa đổi đối số 'được truyền bởi giá trị' bên trong hàm và sử dụng chúng làm biến cục bộ

Đây có phải là điều tốt để làm không? Có bất kỳ cạm bẫy nào khi làm điều này hay là Ok mã hóa như thế này?

Trả lời

7

Về cơ bản, tham số của hàm là biến cục bộ, vì vậy thực tế này không phải là nguyên tắc xấu.

Mặt khác, thực hiện điều này có thể dẫn đến việc duy trì các cơn đau đầu. Nếu một lập trình viên khác xuất hiện sau đó, anh ta có thể mong đợi biến để giữ giá trị được truyền, và thay đổi sẽ gây ra lỗi.

Một lý do để sử dụng lại biến này là khái niệm sai lầm về hiệu quả sử dụng bộ nhớ. Trên thực tế, nó không thể cải thiện hiệu quả và có thể giảm hiệu quả. Lý do là trình biên dịch có thể tự động phát hiện nếu nó hữu ích khi sử dụng cùng một thanh ghi cho hai biến khác nhau ở hai thời điểm khác nhau, và sẽ làm điều đó nếu nó tốt hơn. Nhưng lập trình viên không nên đưa ra quyết định đó cho trình biên dịch. Điều đó sẽ giới hạn các lựa chọn mà trình biên dịch có thể thực hiện.

Cách thực hành an toàn nhất là sử dụng biến mới nếu cần một giá trị mới và dựa vào trình biên dịch để làm cho nó hiệu quả.

+4

Từ quan điểm của trình biên dịch, mọi phép gán cho một biến hiện tại có thể được coi là một biến mới. Vì vậy, trình biên dịch có thể làm cho mã chỉ là hiệu quả cho dù các lập trình viên tạo ra một biến mới hay không. Trong thực tế, hầu hết các kiến ​​trúc vi mô đều có đăng ký đổi tên, do đó trình biên dịch thậm chí không phải bận tâm. –

2

Không có vấn đề gì mà tôi có thể nghĩ đến. Các đối số sẽ được đặt trong khung ngăn xếp hiện tại hoặc trong sổ đăng ký giống như bất kỳ biến cục bộ nào khác. Tuy nhiên, hãy đảm bảo rằng các đối số được truyền theo giá trị. Đặc biệt, các mảng được truyền qua tham chiếu.

+0

Tôi cũng nghĩ rằng nó hoàn toàn ok để sử dụng đối số được truyền theo giá trị như biến tạm thời và sửa đổi chúng: ít nhất bạn đang tiết kiệm một số không gian ngăn xếp (nếu ngăn xếp được sử dụng để giữ chúng); Tôi cũng đã nhìn thấy Stroustrup bằng cách sử dụng cách này trong mã ví dụ của mình trong cuốn sách C++. – cforfun

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