Как заставить динамически распределенные классы распределять их члены в куче?
В настоящее время работаю над кроссплатформенным распределением, где мне дают систему, которая имеет очень ограниченный "стек" в качестве автоматической области видимости для переменных. Однако указанный стек все еще широко используется и быстро заполняется. Мне не разрешили увеличить размер, поэтому я должен решить это программно.
Во-первых, я искал похожие вопросы, наиболее актуальным из которых является этот. Тем не менее, там кто-то заявляет, что член динамически размещенного класса будет размещен в "куче", но это, очевидно, просто детали реализации (так что это может отличаться? Очень запутанно). Также нет четкого ответа на вопрос. Читая ответы, вы все еще не понимаете, кто и где находится в классе.
Для простоты я использую Linear Allocator, который выделяет память с помощью вызова 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, например, вектор. Будет ли он выделять вектор для реализации "стека", так как sizeof(T)
не может знать, насколько большим может быть динамический контейнер, даже если вы зарезервировали место.
Я очень ценю любые предложения, я надеюсь, что смогу прояснить это. Название намекает на проблему XY, но я написал ее так, чтобы подчеркнуть необходимость экономии памяти.