Предполагая, что вы работаете с 32-битной архитектурой, и GLgloat является typedef'd для 32-битной плавающей запятой этой структуры
typedef struct _coordnode {
GLfloat *pts; /* XYZ (vertex) or XY (texture) */
struct _coordnode *next;
} coordnode;
будет использовать 8 байт памяти. Затем, если я правильно понимаю, pts будет указывать на отдельное выделение, которое будет иметь 2 или 3 GlFloats, что составляет 8 или 12 байтов памяти. это 16 или 20 байтов в двух распределениях. пока это
typedef struct _coordnode {
GLfloat pts[3]; /* XYZ (vertex) or XY (texture) */
struct _coordnode *next;
} coordnode;
Всегда 16 байтов, плюс на одну точку отказа меньше, так как это одно выделение, а не два.
Так что, даже если ваш распределитель имеет нулевые накладные расходы (а это не так). Помещение 3-х GLfloats в координатный узел (даже если вы используете только 2 из них) занимает меньше памяти, чем массив GLfloat для отдельного размещения. Кроме того, если вы сделаете это единое распределение, вы получите лучшую согласованность кэша, что в большинстве случаев приводит к повышению производительности.
Такой же анализ может быть выполнен для других ваших структур.
Еще одна вещь, которую я бы сказал, это то, что если вы всегда ставите указатель next
первым в каждой из ваших структур, то один набор функций связанных списков может обрабатывать все ваши списки, так что IMO это лучше
typedef struct _coordnode {
struct _coordnode *next;
GLfloat pts[3]; /* XYZ (vertex) or XY (texture) */
} coordnode;
Если вы когда-нибудь перейдете на удвоение для GLFloat или перейдете на 64-битную архитектуру, ваши указатели больше не будут иметь такой же размер, как ваши GLFloat. В этом случае было бы лучше использовать память для группировки поплавков и указателей вместе.
typedef struct _facenode {
struct _facenode *next;
coordnode *vertices; /* head of linked list */
coordnode *textures; /* head of linked list */
GLfloat *norm; // XYZ (it might be better to make this an array)
GLfloat *color; // RGBA (it might be better to make this an array)
} facenode;