【问题标题】:Stack and heap in PHP?PHP中的堆栈和堆?
【发布时间】:2014-08-05 01:42:58
【问题描述】:

我正在学习操作系统,而我不完全了解的是堆和堆栈。我知道它们的好处以及它们是如何工作的,但是在动态语言的情况下,我无法弄清楚堆栈是如何分配的。

在静态类型语言中,所有原始数据类型都存储在堆栈中,因为它们很小,并且将或多或少按照它们分配的顺序被释放,但是在像 PHP 这样的语言中,直到运行时才知道这一点。那么堆栈大小和变量分配是如何实现的呢?

如果我理解正确,堆栈大小是在编译时通过分析原始数据类型的数量和一些偏移量来确定的。 PHP或其他动态语言是如何完成这个过程的?

如果这个问题在黑暗中被踢,请给我一些指导如何了解这个

【问题讨论】:

  • 我将标签动态编程固定为动态语言

标签: php heap-memory stack-memory dynamic-languages


【解决方案1】:
  1. 如果我理解正确的话,所有 PHP 数据类型都是zval。而zval 是基于一些“Z”数据类型(在 C 中定义的)。 “真实”数据类型的数量是有限的。我相信它们存储在堆栈中。

    所以虽然用户可以创建新的数据类型,但它们不是“真正的”数据类型而是不同的zval 值。并且“真实”数据类型的数量和定义是稳定的。因此堆栈的大小和内容在运行时不会改变。

  2. 内存大小是有限的。 PHP 必须积极地做reference counting 和垃圾回收。更多详情请阅读this slide about PHP memory management

【讨论】:

    【解决方案2】:

    对于dynamic programming language,解释器负责处理。解释行为大致类似于计算机。让我们假设在 32 位机器上运行类似 C 的解释性编程语言:

    c = 10;

    在最小解释中,每个表达式基本上都会发生以下情况:

    • 解释隐式地将c变量类型推导出为整数;
    • c 标识符放在 symbol table
    • 计算表达式的右侧,并将结果与​​c 标识符相关联。

    当你写出这样的表达式时:

    a = c * 2
    

    在符号表中进行查找,查找 c 标识符,如果找到,则符号表中的此条目保存引用,例如,我们的 10 值存储在内存中的位置。这个10 值被加载,然后在表达式中“替换”。

    【讨论】:

    • 那些没有被赋值的值呢?
    • 他们仍然生活在记忆中。
    • 作为什么类型的变量?
    • 作为最后一个值的类型。如果它是变量 'a' 或像 10 这样的数字常量,则类型将分别是标识符或数字。您可能会感到困惑,只有在看到“=”符号时才会解析表达式。
    • 这并不重要。表达式上的任何值都被推送到内存中,并且在看到赋值符号的情况下,它的计算结果被放在这个位置。否则,未使用的值且没有变量指向它。例如,您正在解析 void 表达式类型的 C 语言并从操作数堆栈中弹出值,只要您为其生成代码,一个左值将始终在操作数堆栈上。可以手动弹出。
    猜你喜欢
    • 2014-06-23
    • 2016-04-20
    • 1970-01-01
    • 2013-09-25
    • 2014-12-09
    • 2011-09-29
    • 2015-08-05
    • 2021-12-08
    • 2023-03-20
    相关资源
    最近更新 更多