目前正致力于cross-platform分配,我获得了一个系统,该系统具有非常有限的“堆栈”作为变量的自动范围。然而,所述堆栈仍然是常用的并且快速填满。我不允许增加大小,所以我必须以编程方式解决这个问题。
首先,我搜索了类似的问题,最相关的问题是this one。但是,有人声称动态分配的类的成员将在“堆”上分配,但那些显然只是实现细节(所以它可能会有所不同?非常令人困惑)。此外,这个问题没有明确的答案。阅读答案后,您仍然会发现自己对于哪个班级成员分配到哪里感到困惑。
为简单起见,我使用的是线性分配器,它使用对malloc的调用来分配内存,然后根据类的大小来偏移指针。然后创建/分配类,将完成:
template<typename T> T* CreatePtr(size_t align)
{
void *adr= Allocate(sizeof(T), align);
return new(Adress) T();
}
因此,使用上述方法创建的类可以是:
class A
{
uint64_t size = 0u;
bool foo = false;
void *ptr = nullptr;
}
据我了解,成员size
是在“堆”上分配的,因为class A
是使用LinearAllocated分配的,它使用malloc
调用,因此在类上分配类“堆”实现,在我的平台上相当大。
现在回到问题:对于Windows,Linux等等,这是正确的行为,这意味着变量正在使用内存偏移,因为我使用sizeof(T)
传递大小以确保它可以保持其成员(对吗?)。
如果你有一个STL容器,例如vector,那会怎样?它是否会在“堆栈”实现上分配向量,因为即使您保留空间,sizeof(T)
也不可能知道动态容器有多大。
我非常感谢任何建议,我希望我能清楚这一点。标题会暗示XY问题,但我写道它强调需要节省内存。