C++ 一些堆栈问题

标签 c++ stack

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

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

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

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

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

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

  6. 我了解到这是不可取的 在上分配大变量/对象 堆。太大了多少? This question 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/

相关文章:

c++ - 如何用 `int32_t` 值快速填充内存?

java - 堆栈被覆盖

c++ - 为什么 gprof 告诉我从 main() 只调用一次的函数被调用了 102 次?

c++ - OpenMP:如何在 PARALLEL block 中正确嵌套 MASTER 和 FOR?

c++ - Web 服务器如何知道何时完全接收到 HTTP 请求?

c# - 有没有一种方法可以在 C++ 应用程序和 C# 应用程序之间进行通信?

java - 如何利用递归回溯来解决8皇后问题?

c++ - 如何使用模板链接数据结构中的节点对象?

c - 链表的堆栈实现

c++缓冲区溢出或损坏的变量