【问题标题】:Is it okay to use dictionary memory without 'allot'?可以在没有“分配”的情况下使用字典内存吗?
【发布时间】:2014-12-03 17:13:55
【问题描述】:

我正在做一个编程练习,我试图以不同的方式做同样的事情。 (我碰巧在 Forth 中将两个 3 元素向量相加)。在我的一个修订中,我使用返回堆栈来存储临时值(所以我正在使用该功能),但除此之外,我正在考虑使用未分配的内存作为临时存储。

我创造了两个词来访问这段记忆:

: front! here + ! ;
: front@ here + @ ;

我在实验中尝试过,它似乎对我正在做的事情有效。在我的例程完成后,我没有任何打算使用这个内存。而且我生活在字典里,其中的记忆已经被赋予了程序。

但是,我的直觉仍然告诉我这是一件坏事。这是一件很糟糕的事情吗?

如果重要的话,我正在使用Gforth

【问题讨论】:

    标签: memory-management forth


    【解决方案1】:

    严格来说,语言律师,没有。 ANS Forth 3.3.3.2 状态:

    程序可以在连续分配的区域内执行地址算术。

    您正在任何分配区域之外执行地址算术。

    但是,在某些特定的实现中它可能完全没问题。比如gforth。

    注意有一个词叫PAD,它返回一个临时内存区域的地址。

    【讨论】:

      【解决方案2】:

      如果您知道自己在做什么,那没关系,bud PAD 是比 HERE 更好的地方。还有另一种 ALLOCATE 和 FREE:

      ALLOCATE (u -- a-addr ior)

      分配 u 个地址单元的连续数据空间。数据空间 指针不受此操作的影响。最初的内容 分配的空间未定义。

      如果分配成功,a-addr就是对齐的起始地址 分配的空间和 ior 为零。

      如果操作失败,a-addr 不代表有效地址,并且 ior 是实现定义的 I/O 结果代码。

      免费 (a-addr -- ior)

      将 a-addr 指示的数据空间的连续区域返回给 系统供以后分配。 a-addr 应指示数据区域 之前通过 ALLOCATE 或 RESIZE 获得的空间。这 数据空间指针不受此操作的影响。

      如果操作成功,则 ior 为零。如果操作失败,则 ior 是 实现定义的 I/O 结果代码。 American National Standard for Information Systems

      【讨论】:

        【解决方案3】:

        :前面!这里+! ;

        什么是堆栈图?我猜(n offset_in_cells -- )?

        【讨论】:

        • 威尔巴登稍微修改了这个方案来定义局部变量。
        • 图表看起来不错。它只需要一个值和一个偏移量。
        猜你喜欢
        • 1970-01-01
        • 2019-12-26
        • 2012-07-21
        • 2012-10-11
        • 2011-01-20
        • 1970-01-01
        • 2012-03-21
        • 2013-05-28
        • 2015-12-27
        相关资源
        最近更新 更多