C++ 自定义堆栈分配器,覆盖删除

C++ 自定义堆栈分配器,覆盖删除,c++,stack,new-operator,delete-operator,C++,Stack,New Operator,Delete Operator,我想在我的应用程序中创建一个全局堆栈,并将某些对象放置在此堆栈上。这些对象的大小不是固定的 我现在有, static char contextStack[CONTEXT_MAX_SIZE]; static char *top = &contextStack[0]; 我重写继承的基类的new操作符 static void *operator new(size_t size) { void *Result; Result = top; top = top + size; r

我想在我的应用程序中创建一个全局堆栈,并将某些对象放置在此堆栈上。这些对象的大小不是固定的

我现在有,

static char contextStack[CONTEXT_MAX_SIZE];
static char *top = &contextStack[0];
我重写继承的基类的
new
操作符

static void *operator new(size_t size) {
  void *Result;
  Result = top;
  top = top + size;
  return Result;
};
问题是如何实现
delete
操作符将其从堆栈中弹出?它没有告诉我这个项目有多大?我必须在数组中存储每个条目的大小吗


(注意)最后创建的始终是第一个要删除的。并且符合堆栈。

从我处理堆栈时的汇编经验来看:当代码想要从堆栈中弹出某个对象时,该代码负责知道该对象的大小或预期大小。堆栈只是一行中的一大块数据,从技术上讲,只要有那么多数据,就可以去掉任意大的数据块


因此,您的代码需要提前知道对象有多大(您似乎没有信息)。当然,您可以用任何其他方式实现“堆栈”,包括建议在数组中存储大小。这样做会使拥有堆栈的简单性进一步复杂化,但这在您的实现中可能是必要的。

从我处理堆栈时的汇编经验来看:当代码想要从堆栈中弹出某个对象时,该代码负责知道该对象的大小。堆栈只是一行中的一大块数据,从技术上讲,只要有那么多数据,就可以去掉任意大的数据块

因此,您的代码需要提前知道对象有多大(您似乎没有信息)。当然,您可以用任何其他方式实现“堆栈”,包括建议在数组中存储大小。这样做会使堆栈的简单性进一步复杂化,但在您的实现中可能需要这样做

我必须在数组中存储每个条目的大小吗

您可以使用单独的存储区域,也可以使用
malloc
实现通常遵循的策略:它们将大小存储在返回给您的指针前面的已知位置。当您调用
free
时,他们会检查您传入的指针之前的位置,从那里获取大小,然后继续解除分配

在您的例子中,您可以将块的大小推到块本身之后。当需要弹出堆栈时,首先弹出大小,然后弹出数据块

使用堆栈时需要注意的一点是数据对齐:根据体系结构,以奇数偏移量(偏移量不可分为4、8等)存储多字节类型可能会导致性能下降或总线错误。您需要检查平台细节,看看是否需要在推送到堆栈上的连续元素之间引入额外的“填充”

我必须在数组中存储每个条目的大小吗

您可以使用单独的存储区域,也可以使用
malloc
实现通常遵循的策略:它们将大小存储在返回给您的指针前面的已知位置。当您调用
free
时,他们会检查您传入的指针之前的位置,从那里获取大小,然后继续解除分配

在您的例子中,您可以将块的大小推到块本身之后。当需要弹出堆栈时,首先弹出大小,然后弹出数据块


使用堆栈时需要注意的一点是数据对齐:根据体系结构,以奇数偏移量(偏移量不可分为4、8等)存储多字节类型可能会导致性能下降或总线错误。您需要检查平台的具体情况,看看是否需要在推送到堆栈上的连续元素之间引入额外的“填充”。

在这种情况下,有不同的选项来处理内存。如果按递增顺序返回内存(似乎是这样),则不需要记住大小。最后分配的内存块将从指针分配到顶部,您甚至不需要执行算术,因为将顶部设置为传递给
delete
的指针就足够了

如果按降序分配内存(这在堆栈中很常见),则可以将大小存储在堆栈本身中。执行指针算法以获得新的
结果
top-请求的\u size
),然后减小
sizeof(int)
,将大小存储在那里,并将
top
指针设置为该指针


您应该了解平台中的对齐限制,即使平台允许对所有数据类型进行未对齐的访问,出于性能(和线程安全)原因,您可能仍希望对齐数据。

在这种情况下,有不同的选项来处理内存。如果按递增顺序返回内存(似乎是这样),则不需要记住大小。最后分配的内存块将从指针分配到顶部,您甚至不需要执行算术,因为将顶部设置为传递给
delete
的指针就足够了

如果按降序分配内存(这在堆栈中很常见),则可以将大小存储在堆栈本身中。执行指针算法以获得新的
结果
top-请求的\u size
),然后减小
sizeof(int)
,将大小存储在那里,并将
top
指针设置为该指针


您应该了解平台中的对齐限制,即使平台允许对所有数据类型进行未对齐的访问,出于性能(和线程安全)原因,您可能仍希望对齐数据。

如果您使用模板类来