我们可以在堆之外的其他地方放置动态分配的对象吗?我将如何定义一个重载的新运算符?
如果我有一些类竞技场
class Arena{
char area[2000];
public:
Arena(){}
};
Run Code Online (Sandbox Code Playgroud)
Arena my_arena(1000);
我想从Arena my_arena分配对象..
此外,与在性能等上从堆分配相比,这种内存分配有哪些可能的缺点?
您可以轻松地使用新的展示位置:
MyClass* p = new (area) MyClass;
Run Code Online (Sandbox Code Playgroud)
但是,您必须注意两个问题:
union
{
double dummyForAlignment;
// Any other types which might be necessary...
unsigned char area[2000];
};
这是非常特别的; 关于您必须添加哪些类型以确保无法正式保证.在实践中,我使用的是大多数基本类型的联合,加上几个指针,而不是"double",只是为了确定.
new,编译器不会为您进行破坏,就像普通数据成员一样.你必须明确地调用析构函数:
p->~MyClass();
这意味着您必须跟踪分配了多少对象的类型和位置.
这项技术的缺点是我刚刚提到的两点.另外,除非您保留指向构造对象的类型指针,否则在调试器中查看它们时可能会遇到问题.不过,对于某些特定用途来说,它是一种有用的技术:我在我的Fallible类中使用它,
以避免需要默认的构造函数; 标准容器需要它,当然,通常也使用预标准矢量或数组类.它对各种变体类也很有用; boost::variant例如,我认为它被用于.