Forth 中的内存管理

2024-01-19

所以我刚刚学习 Forth,很好奇是否有人可以帮助我了解内存管理通常是如何工作的。目前我只有(一些)C 堆栈与堆范例的经验。

据我了解,可以在字典中分配,也可以在堆上分配。字典是否像 C 中的堆栈更快/更受欢迎?但与 C 不同的是,它没有作用域和自动堆栈回收,所以我想知道是否只将字典用于全局数据结构(如果有的话)。

就堆而言,它很像 C 语言吗?堆管理是一个标准吗(ANS http://www.forth.org/ansforth/ansforth.html)概念,还是实现定义的?


这个基本问题可能没有以新的 Forth 用户需要的方式得到回答,所以我将尝试一下。

Forth 中的内存可能非常依赖于目标,因此我将限制描述为最简单的模型,即平坦的内存空间,代码和数据在其中愉快地共存。 (与分段内存模型或用于代码的闪存和用于数据的 RAM 或其他更复杂的模型相反)

字典通常从内存底部开始,并由 Forth 系统向上分配。在简单的系统中,这两个堆栈将存在于高端内存中,并且通常有两个指向它们的 CPU 寄存器。 (非常依赖系统)

在最基本的层面上,只需更改字典指针变量的值即可分配内存。 (有时称为DP)

程序员通常不会直接访问该变量,而是使用一些更高级别的字来控制它。

正如第四个词所提到的HERE返回字典空间中的下一个可用地址。没有提到的是HERE通过获取变量的值来定义DP。 (此处的系统依赖性但对于描述很有用)

在福斯HERE可能看起来像这样:

: HERE ( -- addr) DP @ ;

就是这样。

为了分配一些内存,我们需要移动HERE向上,我们用这个词来做到这一点ALLOT.

第四个定义为ALLOT只需从参数堆栈中取出一个数字并将其添加到 DP 中的值即可。所以无非是:

: ALLOT  ( n --)  DP +! ;   \ '+!' adds n to the contents variable DP

ALLOT当我们创建新定义时,FORTH 系统会使用它,以便我们创建的内容安全地位于“分配的”内存中。

一些不是立即显而易见的事情是ALLOT可以取负数,因此可以向上或向下移动字典指针。所以你可以分配一些内存并像这样返回它:

HEX 100 ALLOT

并像这样释放它:

HEX -100 ALLOT 

所有这些都表明这是 Forth 系统中最简单的内存管理形式。如何使用它的一个例子可以在这个词的定义中看到BUFFER:

: BUFFER:  ( n --)  CREATE   ALLOT ; 

BUFFER:在字典中“创建”一个新名称(顺便说一下,create 使用分配为该名称腾出空间),然后在该名称以及 Forth 系统可能使用的任何相关内务字节之后分配 n 字节内存

现在要分配一块命名内存,我们只需键入:

MARKER FOO     \ mark where the memory ends right now

HEX 2000 BUFFER: IN_BUFFER  

现在我们有一个 8K 字节的缓冲区,称为IN_BUFFER。如果想回收 Standard Forth 中的空间,我们可以输入FOO以及之后在字典中分配的所有内容FOO将从 Forth 系统中删除。

但如果你想要临时内存空间,上面的一切HERE可以免费使用!

因此,如果您想喜欢这个,您可以简单地指向一个地址并使用它

:  MYMEMORY  here 200 + ;   \ MYMEMORY points to un-allocated memory above HERE

                            \ MYMEMORY moves with HERE. be aware.

MYMEMORY  HEX 1000 ERASE    \ fill it with 2K bytes of zero

Forth 通常用于高性能嵌入式应用程序,其中动态内存分配可能会导致代码不可靠,因此使用静态分配ALLOT是首选。然而,更大的系统有堆和使用ALLOCATE, FREE and RESIZE就像我们在 C 中使用 malloc 等一样。

BF

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Forth 中的内存管理 的相关文章

  • 卸载屏幕外的 UIImageView 图像

    我正在 Ipad 上编写一个应用程序 在我的应用程序的某个时刻 我使用presentModalViewController 呈现一个ViewController 我的 ViewController 是一个 UISScrollView 它采用
  • 为什么删除 DataFrame 的列或部分会增加内存使用量,以及如何确保对未使用的 DataFrame 切片进行垃圾回收

    处理大型 DataFrame 时 您需要小心内存使用情况 例如 您可能想要分块下载大数据 处理这些块 然后从内存中删除所有不必要的部分 我找不到任何有关处理垃圾收集的最佳程序的资源pandas 但我尝试了以下方法并得到了令人惊讶的结果 im
  • numpy.ndarray 对象不被垃圾回收

    在尝试微调某些 C C 函数的 Python 绑定中的一些内存泄漏时 我发现了一些与 Numpy 数组的垃圾收集相关的奇怪行为 为了更好地解释这种行为 我创建了几个简化的案例 该代码是使用memory profiler 其输出紧随其后 当涉
  • “损坏的双链表”是什么意思

    我最近从我的 PHP 中收到以下错误 WARNING pool www child 42475 said into stderr glibc detected php fpm pool www corrupted double linked
  • 我什么时候应该从正在观察持久模型类的正在关闭的 ViewController 类中调用removeObserver:forKeyPath?

    我有一个ViewController具有一个属性的类 该属性是我想要观察模型属性变化的模型 在我的模型对象中 我有一个在应用程序后台定期更新的属性 当它更新时 我需要在我的内部执行代码ViewController 为此 我从我的模型中创建了
  • VS2010 .NET 内存分析 - 非常慢

    运行 VS2010 的 NET 内存分配分析需要很长时间才能完成 该程序本身运行了大约 3 分钟并生成了 35GB 的内存分配 探查器的输出文件约为 28GB 报告分析流程接管三个小时 在具有 8GB RAM 的双 Xeon 上 即可完成
  • 页面错误陷阱的成本

    我有一个应用程序 它定期 每 1 或 2 秒后 通过分叉自身来获取检查点 因此 检查点是原始进程的一个分支 它一直保持空闲状态 直到原始进程发生某些错误时被要求启动 现在我的问题是fork的写时复制机制的成本有多大 每当原始进程写入内存页面
  • 演员邮箱溢出。斯卡拉

    我目前正在与 scala 的两位演员合作 一 producer 产生一些数据并将其发送到parcer 生产者发送一个HashMap String HashMap Object List Int 通过消息 以及this标记发件人 parcer
  • 变量如何存储在堆栈中?

    我读到有两个内存区域 一个是堆栈 另一个是堆 基本数据类型 如 int double float 等 存储在堆栈中 而引用类型存储在堆中 我们知道堆栈是LIFO这意味着最后推送的元素将首先被删除 现在假设以下代码 int first 10
  • V8 如何管理它的堆?

    我知道V8的垃圾收集在工作时 会从GC的root开始追踪 这样无法到达的对象就会被标记然后被清除 我的问题是GC是如何遍历那些对象的 必须有一个数据结构来存储所有可达或不可达的对象 位图 链接表 顺便说一句 JVM 也做同样的事情吗 艾伦秀
  • Environment.WorkingSet 错误地报告内存使用情况

    Environment WorkingSet 错误地报告在 Windows 2003 Server 上运行的网站的内存使用情况 操作系统版本 Microsoft Windows NT 5 2 3790 Service Pack 2 NET
  • 免费商店的“堆”一词的由来是什么?

    我试图找到免费存储通常被称为堆的官方 或足够好的 原因 除了它从数据段末尾增长这一事实之外 我实在想不出一个很好的理由 特别是因为它与堆数据结构关系不大 注意 很多人提到这只是一大堆没有组织的东西 但对我来说 堆 一词在物理上意味着一堆物理
  • 如何使用 Java 引用释放 Java Unsafe 内存?

    Java Unsafe 类允许您按如下方式为对象分配内存 但是使用此方法在完成后如何释放分配的内存 因为它不提供内存地址 Field f Unsafe class getDeclaredField theUnsafe Internal re
  • mprotect 之后 malloc 导致分段错误

    在使用 mprotect 保护内存区域后第一次调用 malloc 时 我遇到分段错误 这是执行内存分配和保护的代码片段 define PAGESIZE 4096 void paalloc int size Allocates and ali
  • 默认析构函数做了多少事情

    C 类中的默认析构函数是否会自动删除代码中未显式分配的成员 例如 class C public C int arr 100 int main void C myC new C delete myC return 0 删除 myC 会自动释放
  • 弱变量中间为零

    弱变量什么时候变为零 weak var backgroundNode SKSpriteNode texture SKTexture image initialBackgroundImage backgroundNode position C
  • 如何通过替换为空页映射来取消映射 mmap 文件

    Linux 用户空间有没有办法用空页面 映射自 dev null 或者可能是一个空页面 重复映射到从文件映射的页面的顶部 对于上下文 我想找到这个 JDK bug 的修复 https bugs openjdk java net browse
  • C# 中字典的内存使用情况

    我有一些代码添加了嵌套字典 格式如下 Dictionary
  • iOS设备和iPhone模拟器内存​​组织的差异

    我正在尝试使用 Xcode 4 3 3 和 iPhone 5 1 模拟器开发一个应用程序 当我在模拟器上运行这个应用程序时 我没有收到任何警告 并且它运行得很好 但是 当我尝试在 iOS 设备上执行此操作时 我收到一条警告消息 收到内存警告
  • 字符串与 char[]

    我有一些来自 IBM 的幻灯片 名为 从 Java 代码到 Java 堆 了解应用程序的内存使用情况 http www ibm com developerworks library j codetoheap N101DC 也就是说 当我们使

随机推荐

  • 在 GGplot2 中使用 Geom_Bar

    So I m trying to use geom bar in ggplot2 and all of the cases that I see of people demonstrating it online are of compar
  • C# - C 互操作性

    问答位于链接文本 https stackoverflow com questions 3726829 writing a dll in c c for net interoperability非常接近我正在寻找的内容 但我刚刚开始使用 C
  • 电子邮件中的图像:链接还是嵌入?

    我注意到我收到的几乎所有电子邮件都没有嵌入图像 而是从 http 链接它们 当然它们会被默认阻止 我正在为我的服务发送 HTML 电子邮件 并且可以轻松嵌入图像以创建更好的视觉体验 有什么特别的理由不这样做吗 为什么其他人都使用链接而不是嵌
  • `##` 和 `hashCode` 有什么区别?

    方法之间有什么区别 and hashCode 无论哪个类别或哪个类别 它们似乎都输出相同的值hashCode我使用的超载 谷歌也没有帮助 因为它找不到符号 的 子类 AnyVal不守规矩properly从哈希的角度来看 scala gt 1
  • UNIX下如何查看进程是否挂起

    我正在尝试恢复所有已暂停的进程 但我不知道如何检查进程是否已暂停 我尝试过 但它没有表明该进程是暂停还是运行 你可以使用 Ipor 的方式 proc
  • 使用滚动条动态显示面板的布局

    在java中 我一直在尝试创建一个可以接受其他带有滚动条的面板的面板 我尝试使用网格布局 这工作得很好 除了如果我只添加几个面板 它会增长这些面板以适应父面板的大小 我尝试使用 flowlayout 但这使得面板水平流动 因为有滚动条 我该
  • 你能给我指一个大型 Python 开源项目吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想看看用 Python 完成的大型 gt 40 名开发人员 项目是什么样子的 代码是什么样子的 他们使
  • 有没有办法优化std算法?

    搜索有关标准算法性能的任何信息 我发现堆栈溢出问题 https stackoverflow com questions 25622109 why is c stdmax element so slow关于之间的性能差异std max ele
  • C# 垃圾收集

    假设我们有 public void foo someRefType test new someRefType test new someRefType 垃圾收集器对第一个堆对象做什么 在新分配之前是否立即进行垃圾收集 一般机制是什么 垃圾收
  • 如何在 Android Wear 上录制音频

    有什么方法可以在 Android Wear 上录制音频吗 我使用 AudioRecord API 它使应用程序崩溃 难道我做错了什么 short audioData new short minBufferSize AudioRecord a
  • .NetCoreApp 和 .NetStandard.Library 有什么区别?

    Net Core 1 0 几天前发布了 我已经开始使用它了 我创建了一个简单的解决方案 其中一个项目 类库 gt NetStandard Library 和第二个项目是控制台应用程序 NetCoreApp 关键是 控制台应用程序引用了库 但
  • 如何使 UITextField 只有一个文本/数字并使用“下一步/完成”按钮浏览多个“UITextField”

    我必须处理多个导航UITextField使用 下一步 完成按钮 现在我必须在每个按钮中只允许一个文本 数字UITextField我们怎样才能做到这一点UITextField如下图所示 我最近使用了以下代码 也能够实现 但遇到问题 当我第一次
  • 构建失败 jenkins iOS 没有错误

    我让 jenkins 工作来编译 iOS 应用程序 但我的构建失败了 没有错误 CodeSign Users jenkins Library Developer Xcode DerivedData XXXXX com aevqskpxrxf
  • 我可以在 Razor 中使用 @helper 语法返回字符串吗?

    我有一个 RazorHelpers cshtml 文件app code看起来像 using Molecular AdidasCoach Library GlobalConstants helper Translate string key
  • 将工具提示与 Windows 应用程序中的 CHM 帮助集成

    我们正在尝试重新设计 Windows 桌面应用程序的文档流程 我们的两个要求是 以 CHM 格式提供 参考 帮助 提供有关各个控件的工具提示帮助 目前我们的工具提示被硬编码到 Delphi C Builder 表单中 但我理想情况下希望避免
  • libVLC 函数 media_player_new() 抛出分段错误

    media player new 抛出分段错误 import vlc ins vlc Instance player ins media player new 这是它崩溃的地方 Thread 0 Crashed Dispatch queue
  • scala:为什么 1/0 是算术异常但 1.0/0.0 = Double.Infinity

    在 Scala 中 整数算术除以零会抛出 a 这似乎不一致java lang ArithmeticException by zero 但是浮点运算 1 0 0 0 返回Double Infinity 我知道从类型的角度来看 同时拥有 Dou
  • 默认函数参数的有效表达式

    函数或成员函数中默认参数的有效表达式有哪些可能类型 在对函数参数类型的变量进行赋值的上下文中任何正确的内容 Edit编译期间的默认参数根据类型正确性等进行评估 但不会计算它们 并且直到运行时才会进行赋值 您可以将尚未定义的类的构造函数指定为
  • 如何根据方法名称动态调用方法? [复制]

    这个问题在这里已经有答案了 当方法的名称包含在字符串变量中时 如何动态调用该方法 例如 class MyClass def foo end def bar end end obj MyClass new str get data from
  • Forth 中的内存管理

    所以我刚刚学习 Forth 很好奇是否有人可以帮助我了解内存管理通常是如何工作的 目前我只有 一些 C 堆栈与堆范例的经验 据我了解 可以在字典中分配 也可以在堆上分配 字典是否像 C 中的堆栈更快 更受欢迎 但与 C 不同的是 它没有作用