Giả sử tôi có một hàm lấy đối số thuộc loại T
. Nó không đột biến nó, vì vậy tôi có thể lựa chọn đi qua nó bằng cách tham chiếu const const T&
hoặc bằng giá trị T
:Quy tắc ngón tay cái cho khi truyền theo giá trị nhanh hơn đi qua tham chiếu const?
void foo(T t){ ... }
void foo(const T& t){ ... }
Có một quy tắc của ngón tay cái của lớn T
thế nào nên trở thành trước khi đi ngang qua tham chiếu const trở nên rẻ hơn hơn là đi qua giá trị? Ví dụ: giả sử tôi biết rằng sizeof(T) == 24
. Tôi có nên sử dụng tham chiếu const hoặc giá trị không?
tôi cho rằng các nhà xây dựng bản sao của T
là tầm thường. Nếu không, câu trả lời cho câu hỏi phụ thuộc vào sự phức tạp của hàm tạo bản sao, tất nhiên.
Tôi đã tìm kiếm những câu hỏi tương tự và stumbled khi một này:
template pass by value or const reference or...?
Tuy nhiên, câu trả lời được chấp nhận ( https://stackoverflow.com/a/4876937/1408611) không nêu bất kỳ chi tiết, nó chỉ nói:
Nếu bạn mong đợi T luôn là một loại số hoặc một loại rất là giá rẻ để sao chép, thì bạn có thể lấy đối số theo giá trị.
Vì vậy, nó không giải quyết được câu hỏi của tôi mà thay vào đó hãy đặt lại câu hỏi: Loại nhỏ phải là "rất rẻ để sao chép"?
về mặt kỹ thuật, nếu nó lớn hơn 'sizeof (T *)' thì không hiệu quả để vượt qua giá trị (không bao gồm những thứ như tạo bản sao bên trong hàm được gọi) – Creris
@TheOne Không hề. Bạn phải xem xét chi phí tải các phần của đối số mà bạn sử dụng thông qua con trỏ bạn nhận được. Điều này rất lộn xộn rất nhanh, vì vậy cách tốt nhất là dùng thử. Nhưng ví dụ, nếu đối số duy nhất của bạn là một cặp POD gồm hai số nguyên, đi qua giá trị có thể (tùy thuộc vào ABI) chỉ sử dụng hai thanh ghi, trong khi đi qua con trỏ sẽ lãng phí một thanh ghi có sẵn và yêu cầu thêm hướng dẫn bên trong hàm. – delnan
Đồng thời xem xét việc chuyển một thành viên của một cấu trúc/lớp khi chỉ cần một thành viên. –