gpt4 book ai didi

arrays - 在 Elixir 中,推荐使用什么方法来生成 "const array"的等价物?

转载 作者:行者123 更新时间:2023-12-02 09:24:24 25 4
gpt4 key购买 nike

在 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 没有全局变量?我的 Nose 说 @module_attribute 就是这个地方,但我不太确定 @attributes 何时何地展开。

存在一个已知的 Erlang 问题:当您在模块中 -define(LARGE_LIST,[...]) ,然后在函数中使用 ?LARGE_LIST 时。该值在每次函数调用时重新构造。解决方案是在应用程序启动时构造一次并传递给需要它作为参数之一的函数。

Elixir 的 @module_attribute 是否解决了这个问题,还是将其视为奇特的宏扩展?我已阅读关于 module attributes 的官方文档,但我还是很困惑。

最佳答案

从文档来看,Elixir 模块属性的工作方式与 Erlang 模块属性类似,即它们是可以通过 Module:module_info(Attributes) 检索的模块元数据。这最终进入到 beam_load.c 中的函数 attributes_for_module 中,据我所知,该函数在每次访问时都会复制数据。因此,模块属性不适合大量频繁访问的数据。

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

关于arrays - 在 Elixir 中,推荐使用什么方法来生成 "const array"的等价物?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35459753/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com