如何强制动态分配的类也让他们的成员在堆上分配?

时间:2018-03-30 15:52:58

标签: c++ c++11 heap-memory dynamic-memory-allocation stack-memory

目前正致力于分配,我获得了一个系统,该系统具有非常有限的“堆栈”作为变量的自动范围。然而,所述堆栈仍然是常用的并且快速填满。我不允许增加大小,所以我必须以编程方式解决这个问题。

首先,我搜索了类似的问题,最相关的问题是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问题,但我写道它强调需要节省内存。

0 个答案:

没有答案