有没有办法区分对象实例使用的内存类型?

时间:2014-02-21 08:16:42

标签: c++

如果我有这段代码:

#include <assert.h>

class Foo {
public:
    bool is_static();
    bool is_stack();
    bool is_dynamic();
};

Foo a;

int main()
{
    Foo b;
    Foo* c = new Foo;

    assert( a.is_static()  && !a.is_stack()  && !a.is_dynamic());
    assert(!b.is_static()  &&  b.is_stack()  && !b.is_dynamic());
    assert(!c->is_static() && !c->is_stack() &&  c->is_dynamic());

    delete c;
}

是否可以实施is_stackis_staticis_dynamic方法来完成断言?

使用示例:计算Foo类型的特定对象在堆栈上使用但不计算静态或动态内存的内存大小

3 个答案:

答案 0 :(得分:6)

使用标准C ++工具无法做到这一点,无论分配方式如何,都需要确保对象以相同的方式工作。

但是,您可以通过询问操作系统有关您的进程内存映射,并确定给定对象所属的地址范围来执行此操作。 (执行此操作时,请务必使用uintptr_t进行算术运算。)

答案 1 :(得分:1)

向下滚动到第二个答案,根据操作系统提供各种可用选项:

How to determine CPU and memory consumption from inside a process?

我还建议阅读这篇关于C ++中的跟踪记忆Alloactions的文章:

http://www.almostinfinite.com/memtrack.html

请注意,这是一项大量的工作。

答案 2 :(得分:1)

虽然这里的意图很好,但这种做法并不是最好的。 考虑一些事情:

    在堆栈上
  • 为您的方法分配临时变量。您 不要总是担心你使用多少堆栈,因为 临时变量的生命周期很短

  • 与堆栈有关,你通常关心的不是破坏它, 如果您的程序使用指针并访问数据,则会发生这种情况 超出预定范围。对于这类问题,有一个isStatic 功能无济于事。

  • 对于动态内存分配,您通常会覆盖新的/删除 运算符并保​​留计数器以跟踪使用的内存量。所以 再一次,isDynamic功能可能无法解决问题。

  • 在全局变量的情况下(你说静态,但我扩展了 范围一点)在一个单独的数据部分分配(不是 堆栈也不堆积)好吧你并不总是关心它们因为它们 静态分配,链接器将在链接时告诉您是否 你没有足够的空间。另外,如果您可以查看地图文件 我真的想知道地址范围。

因此,大多数问题都是在编译时解决的,说实话,你很少关心它们。其余的(动态内存分配)被区别对待。 但是如果你坚持使用这些方法,你可以告诉链接器生成一个地图文件,它将为你提供所有数据部分的地址范围,并将它们用于你的目的。