Bạn cần phải hiểu lý do, để tránh "lập trình vận chuyển hàng hóa". Việc đánh dấu chuỗi như const tạo ra sự khác biệt hiệu suất bởi vì bạn không còn cần phải sử dụng tăng xen kẽ và giảm số lần truy cập trên chuỗi, hoạt động thực sự trở nên đắt hơn, không ít hơn, khi thời gian trôi qua vì nhiều lõi hơn nghĩa là nhiều công việc hơn điều đó phải được thực hiện để giữ nguyên các hoạt động nguyên tử. Điều này là an toàn để làm vì trình biên dịch thực thi ràng buộc "biến này sẽ không bị thay đổi".
Đối với các phân số, thường là 4 byte trở xuống, sẽ không đạt được hiệu suất. Sử dụng const làm tối ưu hóa chỉ hoạt động khi bạn đang sử dụng các loại giá trị lớn hơn 4 byte, chẳng hạn như mảng hoặc bản ghi hoặc các loại được tính tham chiếu như chuỗi và giao diện.
Tuy nhiên, có một lợi thế quan trọng khác là: khả năng đọc mã. Nếu bạn chuyển một thứ gì đó như const và nó không tạo ra sự khác biệt nào cho trình biên dịch, nó vẫn có thể tạo sự khác biệt cho bạn, vì bạn có thể đọc mã và thấy rằng ý định của nó là không sửa đổi. Điều đó có thể đáng kể nếu bạn chưa từng nhìn thấy mã trước đó (ai đó đã viết nó) hoặc nếu bạn quay lại sau một thời gian dài và không nhớ chính xác bạn đang nghĩ gì khi bạn viết nó lần đầu.
Nguồn
2009-10-21 14:18:38
+1 chắc chắn là một lời giải thích thỏa mãn hơn là của riêng tôi – jpfollenius
Đoạn đầu tiên của bạn là sai về chuỗi. Các chuỗi luôn được truyền dưới dạng biểu diễn con trỏ bốn byte của chúng. 'Const' ngăn chặn mã trong phần mở đầu của hàm và phần kết thúc để cập nhật số tham chiếu của chuỗi. Cũng vậy với các tham số giao diện và mảng động. Tương tự, các bản ghi được chuyển thành con trỏ. 'Const' chỉ đơn thuần là ngăn chặn mã mở đầu sao chép bản ghi vào ngăn xếp cục bộ của hàm. Nói cách khác, 'const' có * không có hiệu lực * ở phía * người gọi của một hàm. Nó chỉ ảnh hưởng đến người nhận cuộc gọi. –
@Rob: Rất tiếc là không thể chỉnh sửa nhận xét. Thật dễ dàng để đọc nhận xét của bạn như thể bạn đang nói rằng các bản ghi luôn được chuyển dưới dạng con trỏ. –