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

C++ 有没有办法区分对象实例使用的内存类型?,c++,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

如果我有此代码:

#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;
}
#包括
福班{
公众:
布尔是静态的();
bool是_stack();
布尔是动态的();
};
福阿;
int main()
{
富b;
Foo*c=新的Foo;
断言(a.is_static()&&!a.is_stack()&&!a.is_dynamic());
断言(!b.is_static()&&b.is_stack()&&&b.is_dynamic());
断言(!c->is_static()&&!c->is_stack()&&c->is_dynamic());
删除c;
}
是否可以实现
是堆栈
是静态的
是动态的
方法来实现断言


使用示例:计算FoO中使用的特定对象的内存大小,但不计算静态或动态内存

< P>这不能使用标准的C++工具来完成,这是为了确保对象无论分配方式如何都是相同的。
但是,您可以通过询问操作系统有关进程内存映射的信息,并确定给定对象的地址范围。(执行此操作时,请确保使用
uintpttr\t
进行算术运算。)

向下滚动至第二个答案,根据操作系统提供了大量可用选项:

我还建议阅读这篇关于在C++中跟踪内存分配行为的文章:


请注意,这是一项繁重的工作。

虽然这里的意图是好的,但方法并不是最好的。 考虑几件事:

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

  • 与堆栈相关的是,您通常关心的是不会破坏它, 如果您的程序使用指针并访问数据,就会发生这种情况 超出预定范围。对于这类问题,是静态的 功能将不会有帮助

  • 对于动态内存分配,通常覆盖新建/删除 操作员,并保留一个计数器以跟踪使用的内存量。所以 同样,isDynamic函数可能不会起作用

  • 对于全局变量(你说的是静态变量,但我扩展了 作用域(位),在单独的数据段中分配(不是 你并不总是关心他们,因为他们 是静态分配的,链接器将在链接时告诉您 你没有足够的空间。另外,如果需要,可以检查地图文件 我真的很想知道地址范围

因此,您的大多数问题都是在编译时解决的,老实说,您很少关心它们。其余的是(动态内存分配)处理方式不同。
但是,如果您坚持使用这些方法,您可以告诉链接器生成一个映射文件,该文件将为您提供所有数据节的地址范围,并将其用于您的目的。

您的意思可能是。问题就在上面。它并没有区分堆栈和堆的使用。是的,但计算一些对象在堆栈上使用的内存量通常无法在编译时解决,因为函数调用和堆栈的使用取决于运行时条件。不,它不是:)将其静态分配堆栈,以便在编译时知道函数将使用的最大堆栈。运行时的变化是程序在特定时间点将使用多少堆栈。这取决于调用了多少函数。@Pandrei-对于某些系统上的普通代码,您所说的可能是正确的,但编译器在编译时无法知道外部调用的堆栈用法。在某些系统上,线程堆栈可能还必须容纳部分或完整的中断帧;编译器在编译时无法知道程序的堆栈使用情况,因为它依赖于数据路径。但是,一个特定对象使用了多少内存,或者一个函数调用需要多少堆栈,在编译时就可以知道了。而且,链接器生成的映射文件只包含由进程加载器引发的线程的堆栈数据——它不知道在运行时会创建哪些或多少个线程。+1:仅仅因为您(几乎)术语正确。