On Wed, Mar 31, 2010 at 10:59 PM, Alain Frisch <al...@frisch.fr> wrote: > On 31/03/2010 19:21, Dmitry Bely wrote: >> >> On Thu, Sep 3, 2009 at 1:44 PM, Xavier Leroy<xavier.le...@inria.fr> >> wrote: >> (...) >>>> >>>> But, I thought that float ref's were automatically unboxed by the >>>> compiler >>>> when they didn't escape the local context. >>> >>> Yes, if all uses of the float ref are unboxed, which is the case in >>> your code. >> >> let max_val (a:float array) = >> let m = ref min_float in >> for i = 0 to (Array.length a) - 1 do >> if a.(i)> !m >> then m := a.(i) >> done; >> !m >> >> !m is not unboxed (Ocaml 3.11). Should it? > > As far as I can tell, the boxing for the reference cell is removed by the > compiler (that is, the reference is implemented as a mutable local > variable), but not the boxing for the float contained in the reference. > Since a is a float array, it is needed to box the float before putting it in > the reference, hence the allocation.
Hmm, my interpretation of Xavier's words was that the compiler would completely optimize out memory allocation and keep !m in register. I can live with the allocation but not at every iteration... How to rewrite the function to get rid of it? My best achievement so far is let max_val (a:float array) = let m = [|-.min_float|] in for i = 0 to (Array.length a) - 1 do if a.(i) > m.(0) then m.(0) <- a.(i) done; m.(0) but it looks ugly... - Dmitry Bely _______________________________________________ Caml-list mailing list. Subscription management: http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list Archives: http://caml.inria.fr Beginner's list: http://groups.yahoo.com/group/ocaml_beginners Bug reports: http://caml.inria.fr/bin/caml-bugs