gpt4 book ai didi

c++ - alloca() 的这种使用有效吗?

转载 作者:行者123 更新时间:2023-11-27 23:05:14 26 4
gpt4 key购买 nike

在使用 std vector 保存我的国际象棋引擎的移动列表后,我意识到因为国际象棋的平均因子为 35(即从典型位置开始大约 35 次合法移动), vector 的大小调整了很多,从而对移动生成器的性能产生负面影响。解决这个问题的一种方法(我今天才意识到)是为 vector 保留最小容量。然而,使用 alloca() 的可能性引起了我的注意。这可能是一个非常简单的问题,但是关于 alloca() 的文档非常稀少,关于如何使用它的示例也非常少。

来自 Allocation of variable-sized class 的回答提到无法调整堆栈分配的大小。然而,以下是否有效?

    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 vector 相比),还是只会增加堆栈溢出的可能性?我的 Move 结构需要大约 28 字节的内存,我怀疑引擎将递归搜索(使用 alpha-beta)到最大 7 层或 8 层,以便可能从堆栈中使用最大 28 * 35 * 8 ~ 8kb。我在某处读到,通常堆栈的限制为 1Mb,所以这应该不会太多吧?

编辑:感谢下面的回答,我现在意识到我最初对 alloca() 所做的事情的理解是错误的。但是,我仍然想知道是否可以按以下方式使用 alloca() :

    int main()
{
int* arr = (int) alloca(sizeof(int));
arr = alloca(sizeof(int) * 2 ));//is this 'resizing' valid?
}

最佳答案

alloca 函数在堆栈上分配内存,一旦调用 alloca 的函数返回,内存就不再可用。这意味着一旦 MoveList 构造函数或 resize 函数返回,内存就不再可用。您假设在 MoveList 对象的生命周期内您将能够以某种方式使用此内存是错误的。

最好的选择是使用 std::vector 并保留。

关于c++ - alloca() 的这种使用有效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24082061/

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