如果我有这段代码:
#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_stack
,is_static
,is_dynamic
方法来完成断言?
使用示例:计算Foo类型的特定对象在堆栈上使用但不计算静态或动态内存的内存大小
答案 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功能可能无法解决问题。
在全局变量的情况下(你说静态,但我扩展了 范围一点)在一个单独的数据部分分配(不是 堆栈也不堆积)好吧你并不总是关心它们因为它们 静态分配,链接器将在链接时告诉您是否 你没有足够的空间。另外,如果您可以查看地图文件 我真的想知道地址范围。
因此,大多数问题都是在编译时解决的,说实话,你很少关心它们。其余的(动态内存分配)被区别对待。 但是如果你坚持使用这些方法,你可以告诉链接器生成一个地图文件,它将为你提供所有数据部分的地址范围,并将它们用于你的目的。