假设在一个程序中我们实现了一个堆栈。但谁创造了堆栈?它是处理器,操作系统还是编译器?
答案 0 :(得分:6)
您是否将程序执行堆栈与堆栈容器混淆了?
你无法“实现”执行堆栈,操作系统会给你虚拟地址空间并找到你的堆栈指针,所以你只需从它推出并弹出,你就不会“创建它”,它就在那里你开始吧。
答案 1 :(得分:4)
如果您的意思是数据结构:处理器执行代码。代码调用操作系统来获取堆栈的内存,然后对其进行操作以将其形成堆栈。编译器只是将您编写的代码转换为处理器可以理解的代码。
如果您的意思是执行堆栈:操作系统负责将进程加载到内存并设置其内存空间以形成堆栈。
答案 2 :(得分:1)
你的程序......它执行所需的程序集。编译器根据正在使用的calling convention代替函数/函数调用插入该程序集。
了解调用约定可能是回答问题的最有效方式。
答案 3 :(得分:1)
以上都不是。您实施它时创建它。编译器只将您的想法(以编程语言表示)转换为机器或汇编代码。处理器只运行您编写的程序。操作系统(假设存在一个)提供了便于为您提供执行空间和内存的机制,但是您的程序确定了执行空间和内存中发生的事情。
答案 4 :(得分:0)
堆栈是后进先出(LIFO)列表数据结构。堆栈由程序执行创建,其中存储变量,根据程序执行要求删除。
答案 5 :(得分:0)
如果要实现自己的堆栈,请尝试使用std :: stack<>。如果你在讨论局部变量所在的堆栈,那就是由C ++运行时系统创建的。
答案 6 :(得分:0)
“假设在一个程序中我们已经实现了一个堆栈。”
然后,您在底层的低级数据结构上实现了它,例如数组。你的stack = array + functions(push(),pop())在数组上工作以提供堆栈功能。
“但谁创建了堆栈?它是处理器,操作系统还是编译器?”
谁创建函数和数组?函数由您创建,然后编译器将函数转换为机器指令并将此代码保持为可执行文件。另外它产生一组指令,为你的数组在内存中分配一些空间。所以你的程序是一个指令和数组空间的混合。然后,操作系统加载程序并向处理器发送指令。处理器执行此指令并将数据读/写到阵列。
答案 7 :(得分:0)
假设你有一个测试C程序:
int square( int val ) { int result; result = val * val; return( result ); } int main( void ) { int store; store = square( 3 ); return( 0 ); }
然后您可以使用命令
gcc -S test.c -o test.s
生成编译器生成的汇编器输出(如果您使用的是Linux平台)。
查看我们获得的square()
函数的生成代码:
square: pushl %ebp movl %esp, %ebp subl $16, %esp movl 8(%ebp), %eax imull 8(%ebp), %eax movl %eax, -4(%ebp) movl -4(%ebp), %eax leave ret
您可以看到编译器已生成代码以移动例程中的局部变量的堆栈指针。
程序的初始化代码将通过调用系统(操作系统)内存分配函数为“堆栈”分配一定量的内存。然后由编译的程序来选择如何利用该内存区域。
幸运的是,所有这些都可以由编译器有效地处理,而不必考虑它(当然,除非你的局部变量对于标准的堆栈大小来说太大了,在这种情况下你可能必须指示您的编译器或线程库从系统分配更多堆栈。
答案 8 :(得分:0)
假设在一个程序中我们实现了一个堆栈。但是谁创建了堆栈?
如果你实现了它,那么根据定义你就创建了它。你需要更具体一点w.r.t.上下文。
答案 9 :(得分:0)
标准运行时库或链接器加载器创建堆栈。它是在您的主要代码之前运行的一小段代码中完成的。链接时链接器会自动插入此代码并在运行时运行,在调用main之前设置各种内容,例如任何静态初始化的全局变量。它通常也会设置堆栈,尽管有些操作系统会将其放入操作系统代码(链接器加载器),因为他们希望在系统上标准化堆栈实现/形状。
答案 10 :(得分:0)