在Elixir语言中,使用随机访问的"const数组“的标准方法是什么?(例如,用于CRC计算的,或AES s-boxes)
从Erlang的背景来看,我认为“数组”本身应该是一个元组,因为通过elem/2 / element/2的访问似乎是O(1) (erts/emulator/beam/bif.c中的函数BIF_RETTYPE element_2(BIF_ALIST_2) )。
但是存储范围呢,因为Erlang/Elixir没有全局?我的鼻子上说@module_attribute是个好地方,但我不太清楚@属性是在什么时候在哪里展开的。
有一个已知的Erlang问题:当您在模块中使用-define(LARGE_LIST,[...]),然后在函数中使用?LARGE_LIST。该值在每个函数调用时被重新构造。解决方案是在应用程序启动时构造一次,并将其作为参数之一传递给需要它的函数。
灵丹妙药的@module_attribute是解决了这个问题,还是被看作是花哨的宏扩展?我读过模块属性上的官方文档,但我仍然很困惑。
发布于 2016-02-17 15:03:56
从文档中可以看出,Elixir模块属性的工作方式类似于Erlang模块属性,即它们是可以由Module:module_info(Attributes)检索的模块元数据。这最终进入了beam_load.c中的函数beam_load.c,据我所见,每次访问数据时,它都会复制数据。因此,模块属性不适用于大量频繁访问的数据。
相反,我会编写一个函数,它不带参数,只返回元组。元组将被编译到模块的常量池中,因此它不会在每次调用该函数时重新构造;该函数实质上返回对常量数据的引用。这在Erlang效率指南中的“常量池”部分中进行了描述。
https://stackoverflow.com/questions/35459753
复制相似问题