В настоящее время я работаю над своим собственным октри в C. Это дерево будет содержать несколько миллиардов объектов, поэтому эффективность использования памяти является ключевым фактором. Чтобы достичь этого, я в настоящее время использую одну структуру с флагом и объединением, но я думаю, что она не чистая, и она тратит пространство для внутреннего узла, потому что мне нужен только 8-битный флаг, но память зарезервирована для 64-битной индекс. Мой код в настоящее время выглядит следующим образом:
typedef struct _OctreeNode
{
uint64_t location_code;
union
{
uint8_t child_exists;
uint64_t object_index;
} data;
uint8_t type;
} OctreeNode;
Я хотел бы разделить это на две разные структуры. Один листовой узел и один внутренний узел. Следующим образом:
typedef struct _OctreeInnerNode
{
uint64_t location_code;
uint8_t child_exists;
uint8_t type;
} OctreeInnerNode;
typedef struct _OctreeLeafNode
{
uint64_t location_code;
uint64_t object_index;
uint8_t type;
} OctreeLeafNode;
Теперь проблема возникает с моей неупорядоченной картой, основанной на хеше кода местоположения. Он использует пустой указатель, поэтому сохранение двух разных структур не является проблемой. Я знаю, что существует возможность иметь флаг первым элементом и разыменовывать указатель на тип данных флага для получения типа, например так:
typedef struct _OctreeLeafNode
{
uint8_t type;
uint64_t location_code;
uint64_t object_index;
} OctreeLeafNode;
void
func(void* node)
{
uint8_t type = *(uint8_t*)node;
if (type == LEAF_NODE) {
OctreeLeafNode* leaf_node = (OctreeLeafNode*)node;
}
}
Мне было интересно, есть ли более чистый способ. Или это не рекомендуется? Как бы я имел дело с множеством возможностей для структур и указателей на пустоту?
Заранее спасибо!