【问题标题】:How to programmatically differentiate objects created on heap and stack section of memory如何以编程方式区分在内存的堆和堆栈部分创建的对象
【发布时间】:2020-03-08 11:08:47
【问题描述】:

假设我想跟踪在 C++ 程序中创建的所有对象。

  1. 在内存的堆栈部分(Object obj;
  2. 在内存的堆部分(使用new动态分配)

有什么方法可以知道堆栈中有多少对象以及堆内存中有多少?在这两种情况下都会调用构造函数,所以它没有帮助。

【问题讨论】:

  • 你为什么要标记javaoop
  • 所有对象都是在堆中创建的(至少对于 Java)[:-)
  • 标准 C++ 没有提供任何方法来区分在堆和堆栈上创建的对象。一个对象不应该关心。
  • @CarlosHeuberger - 如果该方法已被优化(通过 JVM 实现)并且对象没有转义该方法,我认为这是不可靠的。但是问题反复询问C++,Java标签不正确,所以... :-)
  • 听起来像是 XY 问题。请描述你想要达到的目标。

标签: c++ object heap-memory stack-memory


【解决方案1】:

见: What and where are the stack and heap?

特别是:

"操作系统为每个系统级线程分配堆栈时, 创建线程。通常操作系统由语言运行时调用 为应用程序分配堆。”

还有……

...当进程启动时由操作系统分配堆栈 (假设存在操作系统),它由 程序。这也是堆栈更快的另一个原因 - push 和弹出操作通常是一条机器指令,而现代 机器可以在一个周期内完成其中至少 3 个,而分配或 释放堆涉及调用操作系统代码。

因此,我相信您的问题的答案是您需要对操作系统的内部内存分页系统具有完全的 root 访问权限,以跟踪所有对象(尤其是在堆上)。据我所知,所有的垃圾回收系统都使用引用计数的方式来管理堆内存分配,并不直接访问操作系统的堆分配记录。我敢肯定,这有很好的安全原因。

【讨论】:

    猜你喜欢
    • 2012-11-02
    • 2017-11-08
    • 2020-08-24
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 2017-01-04
    相关资源
    最近更新 更多