chuyển qua in
tham chiếu có vẻ tương đương về mặt logic với việc truyền theo giá trị.
Chính xác.
Có một số loại lợi thế hiệu suất?
Đúng.
Tôi tin rằng ở mặt sau của mọi thứ, một ref
tham số ít nhất phải sao chép địa chỉ vật lý của biến, địa chỉ này phải có cùng kích thước với bất kỳ tham chiếu đối tượng điển hình nào.
Không có yêu cầu rằng một tham chiếu đến một đối tượng và một tham chiếu đến một biến đều có cùng kích thước và không có yêu cầu rằng cả hai đều phải là kích thước của một từ máy, nhưng có, trên thực tế cả hai đều là 32 bit trên 32 máy bit và 64 bit trên máy 64 bit.
Tôi không rõ bạn nghĩ "địa chỉ thực" có liên quan gì đến nó. Trên Windows, chúng tôi sử dụng địa chỉ ảo , không phải địa chỉ thực trong mã chế độ người dùng. Trong những trường hợp có thể, bạn sẽ tưởng tượng rằng một địa chỉ thực có ý nghĩa trong chương trình C #, tôi rất tò mò muốn biết.
Cũng không có yêu cầu rằng một tham chiếu thuộc bất kỳ loại nào phải được triển khai làm địa chỉ ảo của bộ nhớ. Các tham chiếu có thể là các chốt không rõ ràng vào các bảng GC trong việc triển khai phù hợp đặc điểm kỹ thuật CLI.
là lợi thế chỉ trong cấu trúc lớn hơn?
Giảm chi phí chuyển các cấu trúc lớn hơn là kịch bản thúc đẩy tính năng.
Lưu ý rằng không có gì đảm bảo in
làm cho bất kỳ chương trình nào thực sự nhanh hơn và nó có thể làm cho các chương trình chậm hơn. Tất cả các câu hỏi về hiệu suất phải được trả lời bằng nghiên cứu thực nghiệm . Có rất ít tối ưu hóa luôn luôn thắng ; đây không phải là tối ưu hóa "luôn thắng".
có một số tối ưu hóa trình biên dịch hậu trường khiến nó trở nên hấp dẫn ở những nơi khác không?
Trình biên dịch và thời gian chạy được phép thực hiện bất kỳ tối ưu hóa nào mà họ chọn nếu làm như vậy không vi phạm các quy tắc của đặc tả C #. Theo hiểu biết của tôi, chưa phải là một tối ưu hóa như vậy cho in
các tham số, nhưng điều đó không loại trừ những tối ưu hóa như vậy trong tương lai.
tại sao tôi không nên đặt mọi tham số là một trong?
Giả sử bạn đã tạo một int
tham số thay vì một in int
tham số. Những chi phí nào được áp đặt?
- trang web cuộc gọi hiện yêu cầu một biến thay vì một giá trị
- biến không thể được đăng ký. Sơ đồ phân bổ thanh ghi được điều chỉnh cẩn thận của jitter chỉ có một cờ lê được đưa vào nó.
- mã tại trang web cuộc gọi lớn hơn bởi vì nó phải lấy tham chiếu đến biến và đặt nó vào ngăn xếp, trong khi trước đó nó có thể chỉ cần đẩy giá trị lên ngăn xếp cuộc gọi
- mã lớn hơn có nghĩa là một số hướng dẫn nhảy ngắn bây giờ có thể đã trở thành hướng dẫn nhảy dài, vì vậy một lần nữa, mã hiện lớn hơn. Điều này có tác động trực tiếp đến tất cả các loại. Bộ nhớ đệm được lấp đầy sớm hơn, bộ nhớ đệm có nhiều việc phải làm hơn, bộ nhớ đệm có thể chọn không thực hiện một số tối ưu hóa nhất định trên kích thước mã lớn hơn, v.v.
- tại trang web callee, chúng tôi đã chuyển quyền truy cập vào một giá trị trên ngăn xếp (hoặc đăng ký) thành một hướng dẫn thành một con trỏ. Bây giờ, con trỏ đó có nhiều khả năng nằm trong bộ nhớ cache, nhưng chúng tôi vẫn chuyển quyền truy cập một lệnh vào giá trị thành quyền truy cập hai lệnh.
- Và như thế.
Giả sử đó là một double
và bạn thay đổi nó thành một in double
. Một lần nữa, bây giờ biến không thể được đăng ký vào một thanh ghi dấu phẩy động hiệu suất cao. Điều này không chỉ có ý nghĩa về hiệu suất mà còn có thể thay đổi hành vi của chương trình! C # được phép thực hiện số học float với độ chính xác cao hơn 64-bit và thường chỉ làm như vậy nếu các float có thể được đăng ký.
Đây không phải là một tối ưu hóa miễn phí. Bạn phải đo hiệu suất của nó so với các lựa chọn thay thế. Đặt cược tốt nhất của bạn là không nên tạo cấu trúc lớn ngay từ đầu, như các nguyên tắc thiết kế đề xuất.
ref
được sử dụng để chuyển cấu trúc bằng tham chiếu thay vì sao chép chúng.in
có nghĩa là cấu trúc không nên được sửa đổi.