gpt4 book ai didi

c++ - 增加堆栈大小以使用 alloca()?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:57:24 24 4
gpt4 key购买 nike

这是两个重叠的问题——我想为大型数组尝试 alloca() 而不是在堆上分配动态大小的数组。这样我就可以提高性能而不必进行堆分配。但是,我的印象是堆栈大小通常很小?增加堆栈的大小以便我可以充分利用 alloca() 有什么缺点吗?是不是我拥有的 RAM 越多,我就可以按比例增加堆栈大小?

编辑 1:最好是 Linux

EDIT2:我心中没有指定的大小 - 我宁愿知道如何判断决定限制/边界的因素。

最佳答案

堆栈大小在大多数 unix-y 平台上(默认情况下)为 8MB,在 Windows 上为 1MB(即,因为 Windows 有 a deterministic way for recovering from out of stack problems ,而 unix-y 平台通常会抛出一个通用的 SIGSEGV 信号).

如果您的分配很大,您将看不到在堆上分配与在堆栈上分配之间的性能差异。当然,堆栈每次分配的效率稍微高一些,但如果您的分配很大,分配的数量可能会很小。

如果你想要一个更大的类似堆栈的结构,你总是可以编写自己的分配器,它从 malloc 获取一个大块,然后以类似堆栈的方式处理分配/释放。

#include <stdexcept>
#include <cstddef>

class StackLikeAllocator
{
std::size_t usedSize;
std::size_t maximumSize;
void *memory;
public:
StackLikeAllocator(std::size_t backingSize)
{
memory = new char[backingSize];
usedSize = 0;
maximumSize = backingSize;
}
~StackLikeAllocator()
{
delete[] memory;
}
void * Allocate(std::size_t desiredSize)
{
// You would have to make sure alignment was correct for your
// platform (Exercise to the reader)
std::size_t newUsedSize = usedSize + desiredSize;
if (newUsedSize > maximumSize)
{
throw std::bad_alloc("Exceeded maximum size for this allocator.");
}

void* result = static_cast<void*>(static_cast<char*>(memory) + usedSize);
usedSize = newUsedSize;
return result;
}

// If you need to support deallocation then modifying this shouldn't be
// too difficult
}

关于c++ - 增加堆栈大小以使用 alloca()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15626737/

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