2013-09-23 64 views
7

Tôi biết rằng các số dấu chấm động thường được đóng hộp trong OCaml, nhưng khó khăn của tôi là từ đó: bình thường. Khi nào chúng không được đóng hộp? Và, nếu chúng không được đóng hộp, chúng được thể hiện như thế nào để thời gian chạy nhận ra chúng khác với int hoặc con trỏ?OCaml nổi đóng hộp hoặc bỏ hộp?

tôi đã tìm thấy http://caml.inria.fr/pub/old_caml_site/ocaml/numerical.html, trong đó liệt kê thời điểm nhất định khi nổi không đóng hộp, nhưng đó là 11 tuổi vì vậy tôi không biết nếu nó vẫn còn to-date lên, và nó không giải thích CÁCH họ tái đại diện khi không đóng hộp.

Tôi mới tham gia OCaml, vì vậy xin lỗi nếu đây là câu hỏi ngớ ngẩn. Cảm ơn!

Trả lời

7

Nổi được mở hộp khi ở trong một mảng và khi trong bản ghi tất cả các trường của nó đang nổi. Có một thẻ đặc biệt cho những trường hợp này đánh dấu bộ sưu tập có chứa các phao không có hộp.

Điều này được mô tả trong Section 19.3 của hướng dẫn OCaml.

2

Ngoài câu trả lời của Jeffrey, lưu ý rằng các trường đa hình (được gán cho một phao) làm không được tính là phao trong tiêu chí "tất cả các trường phải là nổi".

Đó là:

type r = { x: float; y: float; } 
let a = { x = 1.0; y = 2.0; } (* unboxed *) 

type 'a r = { x: 'a; y: 'a; } 
let a = { x = 1.0; y = 2.0; } (* boxed *) 
4

Floats là không có hộp bọc trong hai loại tình huống:

  • Khi có chỉ nổi trong một mảng (ngay cả trong các chức năng đa hình), hoặc trong một bản ghi (lần này, chỉ khi tất cả các trường được xác định là phao nổi tại thời gian biên dịch)

  • Trong chuỗi hoạt động nổi: trình biên dịch sẽ nhận thấy rằng nó không hữu ích đối với hộp một phao chỉ trước khi unboxing nó cho các hoạt động tiếp theo bằng cách sử dụng nó, do đó, phao vẫn unboxed. Trong:

    let x = 
        let y = a +. b in 
        y *. c 
    

    Giá trị y sẽ không được đóng hộp. Tối ưu hóa này cũng được thực hiện trên int32, int64 và nativeint, do đó chúng có hiệu suất rất tốt trong tính toán nặng.

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