【问题标题】:What creates the stack?什么创建了堆栈?
【发布时间】:2009-11-12 13:42:49
【问题描述】:

假设在一个程序中我们实现了一个堆栈。但是谁创建了堆栈?是处理器,还是操作系统,还是编译器?

【问题讨论】:

  • stackoverflow.com/questions/1612982/… 这并不能直接回答您的问题,但它可能会为您解决一些关于计算机如何工作的问题。请阅读这个问题,以及投票第二多的答案(我写的)。
  • 你是指存储返回地址和局部变量的执行栈吗?那是由操作系统创建的。 Linux execve() 为栈分配内存,fork() 也复制父栈中的内容。
  • 堆栈精灵。他们住在北桥下。
  • 这是一个实际的问题吗?如果有,是什么?

标签: c++ c


【解决方案1】:

您是否将程序执行堆栈与堆栈容器混淆了?

你不能“实现”执行堆栈,操作系统会给你虚拟地址空间并在那里找到你的堆栈指针,所以你只需从它推送和弹出,你不“创建它”,它在那里你开始吧。

【讨论】:

  • 你真的应该把它写成评论!
【解决方案2】:

如果您指的是数据结构:处理器执行代码。该代码调用操作系统以获取堆栈的内存,然后对其进行操作以将其形成堆栈。编译器只是把你写的代码变成处理器可以理解的代码。

如果您指的是执行堆栈:操作系统负责将进程加载到内存中并设置其内存空间以形成堆栈。

【讨论】:

  • 真的没有所谓的“堆栈”,一切都只是记忆! (现在不说数据结构栈的实现了。。)呵呵。
  • 如果在电脑没有连接扬声器的情况下堆栈翻倒,它会发出声音吗?
  • 肯定有栈这种东西。堆栈是一块用作后进先出缓冲区的内存。是的,它是记忆,但记忆是有特定目的的。
  • ...有些微控制器还包含硬件堆栈。
【解决方案3】:

您的程序...它执行所需的程序集。该程序集由编译器插入,以代替基于正在使用的calling convention 的函数/函数调用。

了解调用约定可能是回答您问题的最有效方式。

【讨论】:

    【解决方案4】:

    以上都不是。您在实现它时创建了它。编译器仅将您的想法(以编程语言表达)翻译成机器或汇编代码。处理器只运行您编写的程序。操作系统(假设存在)提供了一种机制来帮助您提供执行空间和内存来执行此操作,但您的程序决定了该执行空间和内存中发生的情况。

    【讨论】:

      【解决方案5】:

      如果您想实现自己的堆栈,请尝试使用 std::stack。如果您说的是局部变量所在的堆栈,那是由 C++ 运行时系统创建的。

      【讨论】:

        【解决方案6】:

        “假设我们在一个程序中实现了一个栈。”

        然后您在底层的低级数据结构(例如数组)上实现它。您的堆栈 = 数组 + 函数(push()、pop())在数组上工作以提供堆栈功能。

        “但是谁创建了堆栈?是处理器、操作系统还是编译器?”

        谁创建函数和数组?函数由您创建,然后编译器将函数转换为机器指令并保持此代码可执行。此外,它会生成一组指令来为您的数组分配内存中的一些空间。因此,您的程序是指令和数组空间的混合体。然后操作系统加载您的程序并向处理器发送指令。处理器执行此指令并向您的阵列读取/写入数据。

        【讨论】:

          【解决方案7】:

          假设你有一个测试 C 程序:

          整数方(整数值){ 整数结果; 结果 = 值 * 值; 返回(结果); } 诠释主要(无效){ 国际商店; 商店=广场(3); 返回(0); }

          然后您可以使用命令
          gcc -S test.c -o test.s
          (如果您在 Linux 平台上)生成编译器生成的汇编器输出。

          查看我们得到的 square() 函数的生成代码:

          正方形: 推%ebp movl %esp, %ebp subl $16, %esp movl 8(%ebp), %eax imull 8(%ebp), %eax movl %eax, -4(%ebp) movl -4(%ebp), %eax 离开 ret

          你可以看到编译器已经生成了代码来移动例程中局部变量的堆栈指针。

          您的程序的初始化代码将通过调用系统(操作系统)内存分配函数为“堆栈”分配一定数量的内存。然后由编译后的程序来选择如何使用该内存区域。

          幸运的是,所有这些都由编译器有效地处理,而无需您考虑(当然,除非您的局部变量对于标准堆栈大小来说太大了,在这种情况下您可能必须指示您的编译器或线程库从系统分配更多堆栈)。

          【讨论】:

            【解决方案8】:

            假设在一个程序中我们实现了一个堆栈。但是谁来创建堆栈呢?

            如果你实现了它,那么根据定义你创建了它。你需要更具体的w.r.t。上下文。

            【讨论】:

              【解决方案9】:

              标准运行时库或链接器加载器创建堆栈。它是在你的 main 之前运行的一小段代码中完成的。此代码在您链接时由链接器自动插入并在运行时运行,在调用 main 之前设置各种内容,例如任何静态初始化的全局变量。它通常也会设置堆栈,尽管一些操作系统将其放入操作系统代码(链接器加载器)中,因为他们希望在他们的系统上标准化堆栈实现/形状。

              【讨论】:

                【解决方案10】:

                栈是嵌入在处理器中的,就是esp寄存器,需要学一点win32汇编编程才能理解栈

                【讨论】:

                  【解决方案11】:

                  堆栈是一种后进先出 (LIFO) 列表数据结构。堆栈由程序执行创建,变量存储在其中,根据程序执行要求删除。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2013-07-12
                    • 2011-05-07
                    • 2013-10-25
                    • 2016-10-15
                    • 2020-04-09
                    • 2013-04-03
                    相关资源
                    最近更新 更多