在Elixir中建议使用等效“const数组”的方法是什么?

时间:2016-02-17 14:41:35

标签: arrays erlang const elixir

在Elixir语言中使用随机访问制作“const数组”的规范方法是什么? (例如,在CRC计算中使用的一个,或AES s-box)

从Erlang背景我假设,“数组”本身应该是元组,因为通过elem/2 / element/2的访问似乎是O(1)(函数{ {1}}中的{1}}。

但是存储范围如何,因为Erlang / Elixir没有全局变量?我的鼻子说BIF_RETTYPE element_2(BIF_ALIST_2)就是这个地方,但我不太确定@attributes在何时何地扩展。

有一个已知的Erlang问题:当你在模块中erts/emulator/beam/bif.c然后在函数中使用@module_attribute时。在每次函数调用时重新构造该值。解决方案是在应用程序启动时构造它一次并传递给需要它作为参数之一的函数。

Elixir的-define(LARGE_LIST,[...])是否解决了这个问题,还是被视为奇特的宏扩展?我已经在module attributes上阅读了官方文档,但我仍然感到困惑。

1 个答案:

答案 0 :(得分:7)

从文档中可以看出,Elixir模块属性就像Erlang模块属性一样,即它们是可以由Module:module_info(Attributes)检索的模块元数据。这最终会进入attributes_for_module中的beam_load.c函数,据我所知,每次访问时都会复制数据。因此,模块属性不适合大量经常访问的数据。

相反,我会编写一个不带参数的函数,只返回元组。元组将被编译到模块的常量池中,因此每次调用函数时都不会重建它;该函数实质上返回对常量数据的引用。这在the Erlang Efficiency Guide中的“常量池”部分中进行了描述。