2013-09-23 16 views
7

Wiem, że numery zmiennoprzecinkowe są normalnie zapakowane w OCaml, ale moją trudnością jest to słowo: normalnie. Kiedy nie są zapakowane? A jeśli nie są zapakowane w pudełka, w jaki sposób są reprezentowane, więc środowisko wykonawcze rozpoznaje je jako różne od wzorców lub wskaźników?OCaml unosi się w pudełku lub un-boxed?

Znalazłem http://caml.inria.fr/pub/old_caml_site/ocaml/numerical.html, który zawiera listę określonych czasów, kiedy elementy pływające nie są zapakowane w pudełka, ale ma on 11 lat, więc nie wiem, czy jest nadal aktualny i nie wyjaśnia W JAKI SPOSÓB " Reprezentowany, gdy nie jest zapakowany.

Jestem nowy w OCaml, więc przepraszam, jeśli to jest głupie pytanie nooba. Dzięki!

Odpowiedz

7

Pliki są rozpakowywane, gdy znajdują się w tablicy, a w zapisie wszystkie pola są unoszone. Dla tych przypadków jest specjalny znacznik, który oznacza kolekcję jako zawierającą unboxed floats. Jest to opisane w Section 19.3 instrukcji OCaml

2

Oprócz odpowiedzi Jeffreya, trzeba pamiętać, że pola polimorficzne (które stało się przypisać float) zrobić nie rachubę jako pływaków w „wszystkie pola muszą być pływaki” kryterium.

Czyli:

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

pływaków są unboxed w dwóch rodzajach sytuacji:

  • gdy istnieją pływa tylko w tablicy (nawet w funkcji polimorficznych), lub w rekordzie (tym razem, tylko gdy wszystkie pola zostaną określone jako zmiennoprzecinkowe w czasie kompilacji)

  • Podczas sekwencji operacji float: kompilator zauważy, że nie jest użyteczne float tuż przed rozpakowaniem go do następnej operacji z niego korzystającej, aby packa pozostała rozpakowana. W:

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

    Wartość y nie zostanie zapakowana. Ta optymalizacja jest również wykonywana na int32, int64 i nativeint, dzięki czemu mają bardzo dobre wyniki w ciężkich obliczeniach.