gpt4 book ai didi

c++ - 自定义分配器内存对齐

转载 作者:太空宇宙 更新时间:2023-11-04 14:15:50 24 4
gpt4 key购买 nike

有人可以帮助我使用基于堆栈的分配器吗?

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) 检测栈是否溢出的assert是否正确?

2) align_sizeof() - 我想对齐这些对象以解决性能/总线问题。但是我不完全理解对齐方式。有人可以描述内存对齐,并建议一个公式来对齐堆栈对象吗?

2a) 我目前的想法是“舍入”对象的大小,以便顶部始终对齐。有效地分配比所需更多的内存(在末尾放置填充)。

3) 我猜我还必须对齐静态字符堆栈 ​​[MAX_SIZE] - 我该怎么做?

谢谢!

P.S 随时欢迎任何其他评论

最佳答案

首先,你可以更换static char *top = &Stack[0];static char *top = Stack;,因为数组名是指向第一个元素的指针。

您的代码非常不安全。您正在返回指向数组中元素的指针。该accert是可以的,但考虑这样的用法:

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() 可能 在这种情况下有所帮助,但该类的用户可能不明白实际发生了什么。

关于c++ - 自定义分配器内存对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11390815/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com