gpt4 book ai didi

c++ - 如何知道对象创建是否在堆上..?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:40:16 25 4
gpt4 key购买 nike

我们希望在低延迟系统上工作,堆分配在应用程序中成本更高。但在某种程度上允许在堆上创建对象。这就是为什么我们想要指示对象是否在堆上创建..?

下面的方法是找出在堆内存上创建的对象的正确方法吗?

将有泛型类,其中重载了 new 和 delete 运算符以维护堆分配的指针....

#include <iostream>
#include <set>

using namespace std;

class MemStat //base class
{
typedef set<MemStat*> POINTERS;
static POINTERS m_ptrlist;
public:
void* operator new (size_t size)
{
MemStat* ptr = ::new MemStat;
m_ptrlist.insert(ptr);
return ptr;
}
void operator delete(void* dptr)
{
MemStat* ptr = static_cast<MemStat*>(dptr);
m_ptrlist.erase(ptr);
::delete ptr;
}
// void* operator new[] (size_t sz);
// void operator delete[] (void*);

bool is_on_heap() { m_ptrlist.find(this) != m_ptrlist.end(); }

protected: // ctor & dtor are protected for restrictions
MemStat() { }
virtual ~MemStat() { }
MemStat(const MemStat&) { }
const MemStat& operator=(const MemStat& ) { return *this; }
};
MemStat::POINTERS MemStat::m_ptrlist;

我们需要检查堆创建的最终用户类将从 MemStat 类派生,在实例化基类对象时使用 new 和 delete 运算符调用。

class MyClass : public MemStat   //end user class
{
};

int main()
{
MyClass* myptr = new MyClass;
MyClass obj;

cout << myptr->is_on_heap() << endl; //results into yes
cout << obj.is_on_heap() << endl; //reults into no

delete myptr;
}

最佳答案

请注意,一旦 MyClass 对象是另一个对象的子对象(继承或包含),您的方案可能会或可能不会动态分配。 (而且我所知道的防止动态分配的技巧在那一个上也失败了。)

因此,您所做的只是进一步减慢了堆分配速度而没有获得太多好处。除了少数极少数情况外,分配对象的位置由您的类的用户决定。
如果他们认为他们需要动态分配一个,你有什么不同意的?

关于c++ - 如何知道对象创建是否在堆上..?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4483735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com