如何将对象放在堆之外的其他地方?

bhu*_*hni 0 c++ heap dynamic

我们可以在堆之外的其他地方放置动态分配的对象吗?我将如何定义一个重载的新运算符?

如果我有一些类竞技场

 class Arena{
      char area[2000];
 public:
      Arena(){}
 };
Run Code Online (Sandbox Code Playgroud)

Arena my_arena(1000);

我想从Arena my_arena分配对象..

此外,与在性能等上从堆分配相比,这种内存分配有哪些可能的缺点?

Jam*_*nze 5

您可以轻松地使用新的展示位置:

MyClass* p = new (area) MyClass;
Run Code Online (Sandbox Code Playgroud)

但是,您必须注意两个问题:

  1. 无法保证`area`将正确对齐`MyClass`.我通常通过联盟来解决这个问题:
        union
        {
            double dummyForAlignment;
            //  Any other types which might be necessary...
            unsigned char area[2000];
        };
    
    这是非常特别的; 关于您必须添加哪些类型以确保无法正式保证.在实践中,我使用的是大多数基本类型的联合,加上几个指针,而不是"double",只是为了确定.
  2. 因为您已经使用过new,编译器不会为您进行破坏,就像普通数据成员一样.你必须明确地调用析构函数:
        p->~MyClass();
    
    这意味着您必须跟踪分配了多少对象的类型和位置.

这项技术的缺点是我刚刚提到的两点.另外,除非您保留指向构造对象的类型指针,否则在调试器中查看它们时可能会遇到问题.不过,对于某些特定用途来说,它是一种有用的技术:我在我的Fallible类中使用它, 以避免需要默认的构造函数; 标准容器需要它,当然,通常也使用预标准矢量或数组类.它对各种变体类也很有用; boost::variant例如,我认为它被用于.