Paw*_*ski 6 arrays erlang const elixir
在Elixir语言中使用随机访问制作"const数组"的规范方法是什么?(例如,在CRC计算中使用的一个,或AES s-box)
从Erlang背景我假设,"数组"本身应该是一个元组,因为通过elem/2/的访问element/2似乎是O(1)(函数BIF_RETTYPE element_2(BIF_ALIST_2)输入erts/emulator/beam/bif.c).
但是存储范围如何,因为Erlang/Elixir没有全局变量?我的鼻子说@module_attribute会是这个地方,但我不太确定@attributes扩展的地点和时间.
有一个已知的Erlang问题:当你-define(LARGE_LIST,[...])在模块中然后?LARGE_LIST在函数中使用.在每次函数调用时重新构造该值.解决方案是在应用程序启动时构造它一次并将其作为参数之一传递给需要它的函数.
@module_attributeElixir 是否解决了这个问题,还是被视为奇特的宏观扩张?我已经阅读了关于模块属性的官方文档,但我仍然感到困惑.
从文档中可以看出,Elixir模块属性就像Erlang模块属性一样工作,即它们是可以通过检索的模块元数据Module:module_info(Attributes).这最终会进入函数attributes_for_module中beam_load.c,据我所知,每次访问时都会复制数据.因此,模块属性不适合大量频繁访问的数据.
相反,我会编写一个不带参数的函数,只返回元组.元组将被编译到模块的常量池中,因此每次调用函数时都不会重建它; 该函数实质上返回对常量数据的引用.这在Erlang效率指南的"常量池"部分中有所描述.