struct S{ size_t size; union { float data1[4]; float *data2 {nullptr}; }};
C++ (Qt)struct CData { size_t size; size_t index; // индекс в др контейнере float};
C++ (Qt)struct Data { .... float *m_data;};
C++ (Qt)Data data;data.m_data = FloatAllocator::alloc( 1 ); // Быстро возвращается указатель на буфер в пуле однофлоатов (данные хранятся компактно)data.m_data = FloatAllocator::alloc( 2 ); // Быстро возвращается указатель на буфер в пуле двуфлоатов (данные хранятся компактно)data.m_data = FloatAllocator::alloc( 4 ); // Быстро возвращается указатель на буфер в пуле четырехфлоатов (данные хранятся компактно)data.m_data = FloatAllocator::alloc( 10500 ); // Алоцируется буфер в куче для указанного количества size_t size = FloatAllocator::size( data.m_data ); // Возвращает доступное количество флоатов FloatAllocator::free( data.m_data ); // Для пула просто пометка что буфер освободился, для не преаллоцированых буферов - освобождение
C++ (Qt)template<typename T, size_t maxPrealloc>class Allocator{public: T *alloc( size_t n ); void free( T * ); size_t size( T * );};