Is there a particular reason that stacks and heaps aren't mentioned more often in C++ resources?
在"简而言之"这样的书中,在堆栈和堆上分配的内容被很快地引入。然而,C++源,如"C++编程原理和实践"、标准和CPAPPRECENCE.COM从来没有提到堆栈或堆栈方面的内存分配-甚至当他们谈论存储持续时间/类。为什么会这样?在所有编程语言之间,堆栈和堆的使用是否都相同,是分配给特定于实现的?如果后者是正确的,我会理解在分配不同实体的地方缺乏覆盖范围。
- C和C++之间的差别在于,C的目标是非常小的一组平台,其中堆栈和堆确实存在。相反,C++更通用,它的创建者不想仅限制其对这样的平台的移植性。
- 因为存在没有堆栈和堆的实现。对于平均C和C++嵌入式系统来说,没有堆是正常的。甚至还有一些非常低端的8比特币没有堆栈,但有C编译器支持。
堆栈和堆不是C++语言概念(保存C++标准库中的奇数函数),而是实现概念。
这就是为什么C++书籍会使用标准术语自动和动态存储的原因。
如果你正在读一本关于编译器设计和实现的书,那么你完全可以期待在堆栈和堆上有全面的文章。
- 所以"是的"到"它的实现特定于在哪里分配什么"?
- @迪普:只要分配符合标准,是的。
- 但是,为什么它总是包含在所有C源中——比如"引用类型是在堆上分配的"?
- @DIP:因为"堆"是一个明确的C语言概念。
- 举例来说,C简而言之,另一本语言书,我记不起它的名字,但它并不是真正的编译书籍。
- 你从哪里学来的?我是说,我读过几本书,没有遇到过这些信息。我认为知道..
- 我懂了。但是,在我的问题中提到的C++源有一个非常广泛的使用"具体实现",所以我只是想知道为什么他们没有使用它在像C++的内存模型之类的东西,这是没有意义的吗?例如"实际分配是特定于实现的"。
- @ DIP:C++故意不多说它的内存模型。这样就可以在很多不同的机器上使用。尽管在这方面C更为灵活。
- 好吧。顺便说一句,我现在只想问一些问题来澄清,你已经用我理解的方式回答了实际问题。总之,你所说的是,缺少C++的内存模型的详细阐述可以解释为模型的一部分(例如分配)是特定于实现的吗?
- @迪普:明白了!
- 干净利落,谢谢你!
- @DIP C是一种由单个供应商开发的语言,并根据具体的执行环境(即.NET)进行了实际定制。将其规范与范围广泛的语言(如其他所提到的)相比,作为C++,是很困难的。我知道汽车比较被过度使用了,但这就像在非常广泛地谈论汽车时避免使用"油箱"一词一样,因为有些汽车可能没有"油箱",而是使用电池甚至飞轮。
- 即使在C中,堆栈和堆也是一个实现细节。很遗憾官方文件提到了他们
- 通过增加一个名为"堆栈指针"的指针来分配一些内存是完全不重要的,而其他内存则通过增加另一个名为"第0代堆指针"的指针来分配,因为C不允许您观察这两个指针之间的任何差异。
您感兴趣的不是一本关于C++编程语言/标准的书,而是关于C++标准库的实现。在这里,您将了解更多关于堆栈/堆上内存分配的信息。例如"C++标准库:教程和参考",来自Nicolai M. Josuttis。
因为C/C++也可以在没有任何动态内存分配支持的平台上使用(对于某些嵌入式应用,编译器甚至禁止使用新的和MALOC),所以C++编程书籍里面没有太多的参考。