[英]What is recommended way to make equivalent of “const array” in Elixir?
在Elixir語言中使用隨機訪問制作“const數組”的規范方法是什么? (例如,在CRC計算中使用的一個,或AES s-box)
從Erlang背景我假設,“數組”本身應該是一個元組 ,因為通過elem/2
/ element/2
似乎是O(1)( erts/emulator/beam/bif.c
函數BIF_RETTYPE element_2(BIF_ALIST_2)
)。
但是存儲范圍如何,因為Erlang / Elixir沒有全局變量? 我的鼻子說@module_attribute
就是這個地方,但我不太確定@attributes擴展的地點和時間。
有一個已知的Erlang問題:當你在模塊中定義-define(LARGE_LIST,[...])
然后在函數中使用?LARGE_LIST
。 在每次函數調用時重新構造該值。 解決方案是在應用程序啟動時構造它一次並將其作為參數之一傳遞給需要它的函數。
Elixir的@module_attribute
是解決這個問題還是被視為奇特的宏擴展? 我已經閱讀了關於模塊屬性的官方文檔,但我仍然感到困惑。
從文檔中看,Elixir模塊屬性看起來像Erlang模塊屬性,即它們是模塊元數據,可以通過Module:module_info(Attributes)
檢索。 這最終進入beam_load.c
的函數attributes_for_module
,據我beam_load.c
,每次訪問時都會復制數據。 因此,模塊屬性不適合大量頻繁訪問的數據。
相反,我會編寫一個不帶參數的函數,只返回元組。 元組將被編譯到模塊的常量池中,因此每次調用函數時都不會重建它; 該函數實質上返回對常量數據的引用。 這在Erlang效率指南的“常量池”部分中有所描述。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.