有人可以帮助我的基于堆栈的分配器。
static char Stack[MAX_SIZE];
static char *top = &Stack[0];
class STACKED {
public:
static void *operator new(size_t size) {
//Add this context to the context stack.
void *Result;
assert( (top + size) <= &Stack[MAX_SIZE] );
Result = top;
top = top + align_sizeof(size);
return Result;
}
static void operator delete(void *p) {
//Its a stack, and delete only removes the top entry.
// So *p represents where to delete to.
top = (char *)p;
}
static size_t align_sizeof(size_t object_size) {
// TODO: Align objects.
return object_size;
}
};
1)断言是否正确,以检测堆栈是否会溢出?
2)align_sizeof() - 我喜欢将这些对象与性能/总线问题对齐。但我不完全理解对齐。有人可以描述内存对齐,并建议一个公式来对齐堆栈对象吗?
2a)我目前的想法是&#34;综合&#34;对象的大小,以便顶部始终对齐。有效地分配比所需更多的内存(在末尾放置填充)。
3)我猜我还必须对齐静态字符堆栈[MAX_SIZE] - 我该怎么做?
三江源!
P.S欢迎任何其他评论
答案 0 :(得分:0)
首先,你可以替换
static char *top = &Stack[0];
static char *top = Stack;
,因为数组名称是指向第一个元素的指针。
您的代码非常不安全。您正在返回指向数组中元素的指针。加入是好的,但请考虑这样的用法:
STACKED a;
char * foo = (char *)a.operator new(10);
foo += 10000000;
*foo= 's';
这会导致崩溃,而你的断言不会对此有所帮助。
如果你想管理内存,你应该将你的数组放在类中,让类处理所有用法,而不是让用户使用直接指针。在这种情况下,您将能够跟踪用户是否想要访问债券指数。
删除对象时,不仅要移动堆栈顶部。如果用户试图删除堆栈“中间”的项目,则需要适当地更改堆栈状态,但要小心不要破坏已经分配的内存的指针。
至于对齐,你需要检查wiki,希望这会有所帮助。
此外,当您删除元素时,您应该检查您获得的指针是否真正指向堆栈内的某个位置。这是一个错误代码的例子:
STACKED a;
char * foo = new char(10);
a.operator delete(foo - 10000);
char * crash = (char *)a.operator new(10);
在这种情况下,您的assert()
可能有所帮助,但是该类用户可能无法理解实际发生的情况。