c++ - 如何将对象放置在堆以外的其他地方?

标签 c++ dynamic heap-memory

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

如果我有像竞技场这样的类

 class Arena{
      char area[2000];
 public:
      Arena(){}
 };

竞技场 my_arena(1000);

我想从 Arena my_arena.. 分配对象

此外,与堆分配相比,这种内存分配在性能等方面可能存在哪些缺点?

最佳答案

您可以轻松地为此使用 placement new:

MyClass* p = new (area) MyClass;

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

  1. > 无法保证 `area` 会正确对齐 `我的类(class)`。我通常通过 union 来解决这个问题:
        union
        {
            double dummyForAlignment;
            //  Any other types which might be necessary...
            unsigned char area[2000];
        };
    
    这是非常临时的;没有关于你是什么类型的正式保证 必须添加才能确定。在实践中,我使用 union 而不是 `double` 大多数基本类型,加上一些指针,只是为了确定。
  2. > 因为你使用了 new,所以编译器不会处理 为您销毁,就像对普通数据成员一样。你会有 显式调用析构函数:
        p->~MyClass();
    
    这意味着您必须跟踪有多少对象 类型和位置已分配。

这种技术的缺点是我刚才提到的两点。 另外,除非你保留一个指向构造对象的类型化指针,否则你可能 在调试器中查看它们时遇到问题。 尽管如此,对于某些特定用途,它仍然是一种有用的技术:我在我的 Fallible 类,为了避免默认构造函数的需要;这 标准容器需要它,当然,预标准 vector 或 数组类通常也使用它。它也适用于各种 变体类;例如,我假设它用于 boost::variant

关于c++ - 如何将对象放置在堆以外的其他地方?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9715930/

相关文章:

c++ - 在哪里声明结构运算符重载

asp.net-mvc-3 - ASP.NET MVC3 : How to get access to parameters passed as routeValues anonymous type in a HtmlHelper extension method?

java - 内存不足错误,java堆空间

php - 动态网站安全问题(PHP+MySQL)

memory - 创建一个返回空结构实现的工厂类

java - 特定于线程的堆分配

无法识别类模板的 C++ 成员函数

C++运行时错误?如何解决这个问题并检查?

c++ - std::destroy对基本类型是否无效?

c++ - 错误,动态分配对象到数组