在使用标准向量保存我的国际象棋引擎的移动列表后,我意识到因为国际象棋的平均因子为 35(即从典型位置开始的 35 次合法移动),向量的大小调整了很多,从而对移动发生器的性能。解决这个问题的一种方法(我今天才意识到)是为向量保留最小容量。然而,使用 alloca() 的可能性引起了我的注意。这可能是一个非常简单的问题,但是关于 alloca() 的文档非常稀缺,很少有关于如何使用它的示例。
因此,来自可变大小类分配的答案提到堆栈分配无法调整大小。然而,以下内容是否有效?
struct MoveList
{
MoveList(): capacity(10)
{
moves = (Move*) alloca(sizeof(Move) * 10);
}
void resize()
{
capacity *= 2;
moves = (Move*) alloca(sizeof(Move) * capacity );
}
void push_back();
Move* moves;
int size;
int capacity;
}
具体来说,如果说,第一次 alloca() 的容量不足 10,那么简单地再次调用 alloca() 以分配更多内存在语法上是否有效(并且正确)?这种方法会提供更好的性能(与使用 reserve() 的 std 向量相比),还是只会增加堆栈溢出的机会?我的 Move 结构需要大约 28 字节的内存,我怀疑引擎会递归搜索(使用 alpha-beta)到最多 7 或 8 层,因此可能会从堆栈中使用一些 28 * 35 * 8 ~ 8kb max . 我在某处读到,通常堆栈的限制为 1Mb,所以这应该不会太多吧?
编辑:感谢下面的答案,我现在意识到我最初对 alloca() 所做的理解是错误的。但是,我仍然想知道是否可以通过以下方式使用 alloca():
int main()
{
int* arr = (int) alloca(sizeof(int));
arr = alloca(sizeof(int) * 2 ));//is this 'resizing' valid?
}