繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM