Memory management 在内存管理上下文中,静态堆栈和动态堆栈有什么区别 静态存储区域的大小在整个执行过程中是恒定的,但动态堆栈会随着激活记录的推送和弹出而增减 在静态堆栈中执行之前已知的存储要求,但在int动态堆栈中,堆栈帧的大小和结构在编译时已知,但实际内容和分配时间在运行时之前是未知的

Memory management 在内存管理上下文中,静态堆栈和动态堆栈有什么区别 静态存储区域的大小在整个执行过程中是恒定的,但动态堆栈会随着激活记录的推送和弹出而增减 在静态堆栈中执行之前已知的存储要求,但在int动态堆栈中,堆栈帧的大小和结构在编译时已知,但实际内容和分配时间在运行时之前是未知的,memory-management,dynamic,static,stack,Memory Management,Dynamic,Static,Stack,还有什么区别,谁能帮我写一段代码。 谢谢。我可以在这里插话,因为我目前正在开发一种采用静态堆栈的系统 由于您提到了堆栈帧,您必须知道,当您输入更深的嵌套子例程时,堆栈用于跟踪上下文。只需在下一段中明确提及此b/c即可 通常,堆栈和堆被视为动态的,这意味着允许它们在大小上扩展-通常通过malloc()等行的内存管理来完成。正如您在中间面板中看到的那样,堆栈以一种组织良好的方式增长+收缩,因为内存只能在底部边缘分配或释放。另一方面,堆可以看到内存在内部任何位置分配/释放。当两个区域相遇时会发生冲突—

还有什么区别,谁能帮我写一段代码。
谢谢。

我可以在这里插话,因为我目前正在开发一种采用静态堆栈的系统

由于您提到了堆栈帧,您必须知道,当您输入更深的嵌套子例程时,堆栈用于跟踪上下文。只需在下一段中明确提及此b/c即可

通常,堆栈和堆被视为动态的,这意味着允许它们在大小上扩展-通常通过
malloc()
等行的内存管理来完成。正如您在中间面板中看到的那样,堆栈以一种组织良好的方式增长+收缩,因为内存只能在底部边缘分配或释放。另一方面,堆可以看到内存在内部任何位置分配/释放。当两个区域相遇时会发生冲突——这将导致一个大问题,因为无法调用更多的子例程。此外,很难预测何时会发生这种情况

如果要避免此类问题(例如在安全关键型应用程序中),可以选择在堆栈+堆的一个或两个堆栈中禁止动态内存使用。使用静态堆栈的最佳时机是确信程序永远不会超过子例程调用的特定深度(例如,没有递归或递归被限制)。使用静态堆栈还简化了实现,这是您在裸机应用程序上可能关心的问题

以下代码是如何在启动代码中实现静态堆栈的一个小示例:

//*****************************************************************************
//
//为系统堆栈保留空间。
//
//*****************************************************************************
__属性(节(“.stack”))
静态uint32_t g_pui32堆栈[1024];
部分
属性允许您使用链接器脚本在内存中定位堆栈:

ENTRY(Reset_Handler)

MEMORY
{
    FLASH (rx) : ORIGIN = 0x0000C000, LENGTH = 960K
    SRAM (rwx) : ORIGIN = 0x10000000, LENGTH = 384K
}

SECTIONS
{
    .text :
    {
        /* This is where executable code gets stored */
    } > FLASH

    /* User stack section initialized by startup code. */
    .stack (NOLOAD):
    {
        . = ALIGN(8);
        *(.stack)
        *(.stack*)
        . = ALIGN(8);
    } > SRAM

    .data :
    {
        /* This is where global/static initialized variables are stored */
    } > SRAM AT>FLASH

    .bss :
    {
        /* This is where global/static 0-filled variables are stored */
    } > SRAM

    .heap (COPY):
    {
        /* This is where dynamically allocated storage could be used */
    } > SRAM
}


您可以看到,在这种情况下,堆栈不位于堆旁边。。。静态堆栈可以放在任何你想放的地方,因为假设你永远不会超越它的边界。

不清楚你真正想要的是什么。静态堆栈和动态堆栈的区别不是在数据结构的上下文中,而是在内存管理中。我猜部分问题是,你说的“静态堆栈”是什么意思?