簡體   English   中英

鏈式單元 function 和 OCaml 中的運行時堆棧之間是否有區別

[英]Is there a difference between a chained unit function and a stack in runtime in OCaml

為了存儲單元 function 以便稍后調用它們,我使用(unit -> unit) ref提供了這個解決方案:

let all_instr = ref @@ fun () -> () in
  let add_unit unit_f = let old_f = !all_instr in all_instr :=
     fun () -> (unit_f (); old_f ()) in
(* call add_unit *)
!all_instr () (* call all the functions I stacked *)

我想知道我的解決方案與像這樣的一堆單元 function 在它們的表示方式上是否有區別,memory 方面。

let all_instr = ref [] in 
let add_unit f = all_instr := f :: all_instr in
(* call add_unit *)
List.iter (fun f -> f()) !all_instr

例如,如果我想保存大量這樣的函數,那么從 memory 和解堆棧時的速度方面來說,哪種解決方案會更優化?

不使用它們而是使用另一種解決方案會更好(對於這兩個標准)嗎?

在這兩種情況下,您都有一個功能列表。 在第一種情況下,列表的節點是 function 閉包。 在第二種情況下,它們是缺點元素。 我不知道 OCaml 中閉包表示的來龍去脈,但我猜想閉包比 cons 元素大(它需要 3 個 memory 插槽用於 header、car 和 cdr(使用舊學校術語))。

當需要調用時,兩種情況都將獲取指向下一個 function 的指針並調用它。 在第一種情況下,指針將從閉包的環境(變量綁定)中獲取。 在第二種情況下,它將從缺點中獲取。 我懷疑環境的訪問效率與 cons 單元大致相同。 即,代碼可以使用固定偏移量而不是符號查找。

這些只是猜測。 編寫兩種不同的方法並進行比較實際上會很有趣(也很有趣)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM