2014-12-04 38 views
2

当我在我SO阅读了大量的意见引导(特别是在C)直接堆栈和堆访问;虚拟或硬件级别?

“动态分配永诺去堆,在堆栈上自动分配”

但是,尤其是关于为纯CI disaggree接着就,随即。由于ISO/IEC9899甚至没有放弃堆栈或堆栈。它只提到了三个存储过程(静态,自动和分配),并建议如何处理每个存储过程。

什么会让编译器的选项做到这一点,即使是相反,如果它愿意。

所以我的问题是:

是堆和现有堆物理是(即使不是在C)一种标准化的语言可以说” ...有发生在堆和...栈上“?

或者他们只是一个管理内存访问的virtuell系统,因此语言无法制定有关它们的规则,因为甚至无法保证环境支持它们?

在我的知识库中,只有第二个才有意义。但是我多次阅读写评论的人,比如“在XY语言中这会发生在堆栈/堆上”。但是,如果我是对的,只要语言不仅仅是为了保证有堆栈和堆的系统而做的,这就必须是不确定的。所有的评论都是错误的。

那是什么让我问这个问题。我是否错了,或者在推理过程中出现了很大的错误?

+0

可能的重复[什么和堆栈和堆?](http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap) – MatthiasB 2014-12-16 10:44:15

+0

@Matthias严重?这篇文章询问关于堆和堆栈被视为更多的虚拟或物理系统。在问这个问题之前,我读了你写的那篇文章,我可以用纯粹的良知说,甚至连我在这里提到的问题的方面都没有提到。所以不,绝对不是重复的。 – dhein 2014-12-16 10:52:28

+0

[这个答案](http://stackoverflow.com/a/13326916/1810521)似乎是一个很好的回答你的问题,也就C编译器。 – MatthiasB 2014-12-16 12:30:09

回答

2

你说得对,C规范不要求使用堆或堆栈,只要它正确地实现了存储类。然而,实际上每个编译器都会使用自动变量和堆分配变量的堆栈。虽然你可以实现一个不使用堆栈或堆的编译器,但它可能不会很好,大多数开发人员都不会很熟悉。

所以当人们说“永远”时,他们真的是指“几乎总是”。

+0

只是另一个方面:想象一个分配存储类型的内存块。它被分配和释放的范围内,在任何情况下都不会遗留存储空间。如果块足够小,编译器仅仅使用堆栈上的内存不是一件好事吗?所以对于这种情况:在这种情况下,“malloc将会堆在”堆栈语句甚至是错误的吗? ;) – dhein 2014-12-16 10:46:18

+0

@Zaibis:编译器无法预测一般函数何时会被调用,所以它不知道堆栈中调用的深度有多大=>无法知道“足够小”是什么。 (这是假设编译器知道有多少堆栈可用 - 它通常不能,运行时/操作系统可以配置不同的堆栈大小/限制。) – Mat 2014-12-16 11:09:58

+0

@Mat好的,关于我认同的东西有多深。但编译器可以知道(它甚至可以设置!)堆栈大小。所以它可以与小什么和小什么不相关。所以可以说我们有一个2MB的堆栈。还有一个是malloc(),一个4字节的块,在任何方式释放之前,该范围内的另一个被分配或范围剩下。如果你深入了解它,它会减少4个字节,比你不应该打开编译器优化,也不要依赖“程序不会崩溃”。这样做是不寻常的,也许甚至没有任何编译器这样做。但事实是:它不会违反任何法律! – dhein 2014-12-16 12:02:08