gpt4 book ai didi

C++ 一些堆栈问题

转载 作者:太空狗 更新时间:2023-10-29 19:44:34 25 4
gpt4 key购买 nike

首先让我说我已经阅读了this tutorial并阅读了this question .我的问题是:

  1. 堆栈可以有多大?是吗处理器/架构/编译器依赖?

  2. 有没有办法确切地知道有很多内存可供我使用函数/类堆栈以及有多少目前正在使用,以便避免溢出?

  3. 使用现代编译器(例如 gcc 4.5)在现代计算机上(例如 6 GB 内存),我需要担心堆栈吗溢出还是它的事情过去?

  4. 是实际的栈内存物理上在 RAM 上还是在 CPU 缓存上?

  5. 栈内存快多少访问和读取与堆相比访问和阅读?我意识到时间是 PC 特定的,所以比率是够了。

  6. 我了解到这是不可取的在上分配大变量/对象堆。太大了多少? Thisquestion here给出了答案对于 win32 中的线程,1MB。如何关于 Linux amd64 中的线程?

如果已经提出并回答了这些问题,我深表歉意,欢迎任何链接!

最佳答案

  1. 是的,堆栈大小的限制各不相同,但如果您在意,您可能做错了什么。
  2. 一般情况下,您无法获得有关程序可用内存量的信息。即使您可以获得此类信息,通常在您可以使用之前就已经过时了。
  3. 如果您跨线程共享对数据的访问,那么是的,您通常需要序列化访问,除非它们是严格只读的。
  4. 您可以将堆栈分配对象的地址传递给另一个线程,在这种情况下,您(再次)必须序列化,除非访问是严格只读的。
  5. 即使在具有大量内存的现代机器上,您也肯定会溢出堆栈。堆栈通常仅限于整个内存的一小部分(例如 4 MB)。
  6. 堆栈被分配为系统内存,但通常使用得足够多,以至于在任何给定时间至少有一个或两个顶部页面通常会在缓存中。
  7. 作为堆栈和堆的一部分对访问速度没有直接影响——两者通常驻留在相同的内存芯片中,甚至通常位于同一内存芯片中的不同地址。主要区别在于堆栈通常是连续的并且经常使用,所以最上面的几页几乎总是在缓存中。基于堆的内存通常是碎片化的,因此需要缓存中不存在的数据的可能性要大得多。
  8. 关于您应该在堆栈上分配的对象的最大大小几乎没有变化。即使堆栈可以更大,也没有理由在那里分配巨大的对象。
  9. 在 C++ 中避免内存泄漏的主要方法是 RAII(又名 SBRM,基于堆栈的资源管理)。
  10. 智能指针本身就是一个很大的课题,Boost 提供了几种。以我的经验,集合有更大的不同,但基本思想在很大程度上是相同的:让程序员不必跟踪可以使用或应该释放特定对象的每种情况。

关于C++ 一些堆栈问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6553945/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com