【问题标题】:Reading from a stack and memory allocation at compile time在编译时从堆栈和内存分配中读取
【发布时间】:2012-01-07 17:23:45
【问题描述】:

对象只能从堆栈顶部放置和删除。但是读取和写入它们的值呢?如果我错了,请纠正我,但我认为进程必须能够从堆栈的任何部分读取,因为如果只能从顶部读取,它就必须删除(并存储在某处)上面堆栈的全部内容它要检查的变量。但在这种情况下,进程如何知道堆栈中的某个特定变量的确切位置?我怀疑它只是保存了一个指向它的指针,但是该指针存储在哪里?

另一件事——阅读堆栈时,我经常会发现诸如“堆栈上分配的所有内存在编译时已知”之类的短语。好吧,我可能误解了这一点,所以请告诉我我的逻辑缺陷在哪里: 假设当if() 语句为真时创建了一个局部变量,而当它为假时则不是。是否正确将在运行时显示。因此在编译时无法知道是否应该创建它,因此我认为根本不会为其分配内存,因为这会很浪费。因此,它不是在编译时创建/知道的。

【问题讨论】:

    标签: stack memory-management


    【解决方案1】:

    在编译时,就知道每种类型需要多少空间:例如,一个 Integer 在 32 位平台上是 4 Bytes 宽,而具有 2 Integers 的类占用 8 Bytes。不一定知道此空间是否分配给特定变量(如您所述,可能取决于if)。

    当您调用一个方法时,所有参数和返回地址都被压入堆栈。要获取一个参数,您需要沿着堆栈向上走到它的位置,该位置由基指针和每个参数的大小计算得出。

    因此,对于这个堆栈来说,您只能访问顶部元素并不完全正确。但是,它适用于 Stack 数据结构。

    【讨论】:

    • 那么只有一个问题——因为我读过的所有文章都提到“堆栈上分配的所有内存在编译时都是已知的”。我认为这在某种程度上很重要,但现在真的不明白这是怎么回事?
    • 嗯,这听起来我有些不对劲,虽然我习惯于确定我不是:) ...你有其中一篇文章的链接吗?据我所知,只有每种类型的确切大小在编译时才确切知道。
    • learncpp.com/cpp-tutorial/79-the-stack-and-the-heap - 位于文章底部的堆栈优缺点简短列表中
    • 我认为这意味着如果你在堆栈上分配内存,你就知道变量在内存中的非常精确的大小和位置。相反,在堆上,堆管理器在anywhere 分配足够(tm) 的内存量(通常是2 的幂)并返回一个指针。因此,堆栈变量访问可以直接编译为汇编中的指针算术魔术(基指针减去 n * 4 字节),而对于堆空间,您必须通过指针进行。不过看看别人怎么想,细节可能有点超出我的认知。
    • 哦,亲爱的,很抱歉有错别字。重读这种伤害:/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 2012-12-05
    • 2021-11-18
    • 1970-01-01
    • 2019-05-17
    • 2023-03-07
    相关资源
    最近更新 更多