我们可以将动态分配的对象放在堆以外的其他地方吗?我将如何为此定义一个重载的新运算符??
如果我有像竞技场这样的类
class Arena{
char area[2000];
public:
Arena(){}
};
竞技场 my_arena(1000);
我想从 Arena my_arena.. 分配对象
此外,与堆分配相比,这种内存分配在性能等方面可能存在哪些缺点?
最佳答案
您可以轻松地为此使用 placement new:
MyClass* p = new (area) MyClass;
但是,您必须注意两个问题:
- >
无法保证 `area` 会正确对齐
`我的类(class)`。我通常通过 union 来解决这个问题:
union { double dummyForAlignment; // Any other types which might be necessary... unsigned char area[2000]; };
这是非常临时的;没有关于你是什么类型的正式保证 必须添加才能确定。在实践中,我使用 union 而不是 `double` 大多数基本类型,加上一些指针,只是为了确定。 - >
因为你使用了
new
,所以编译器不会处理 为您销毁,就像对普通数据成员一样。你会有 显式调用析构函数:p->~MyClass();
这意味着您必须跟踪有多少对象 类型和位置已分配。
这种技术的缺点是我刚才提到的两点。
另外,除非你保留一个指向构造对象的类型化指针,否则你可能
在调试器中查看它们时遇到问题。
尽管如此,对于某些特定用途,它仍然是一种有用的技术:我在我的
Fallible
类,为了避免默认构造函数的需要;这
标准容器需要它,当然,预标准 vector 或
数组类通常也使用它。它也适用于各种
变体类;例如,我假设它用于 boost::variant
。
关于c++ - 如何将对象放置在堆以外的其他地方?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9715930/