Andaba armando un sencillo (por el momento) motor, cuando me surgió la duda de cuál forma puede ser más optimizada al acceder a memoria. Entre las dos formas que contiene la misma función.
void drawEntities(entitymanager* man)
{
// Forma uno
for(uint i=0; i<man->entities->size; ++i)
drawEntity(Vector_getValue(man->entities,i));
// Forma dos
entity* ents = man->entities->data;
for(uint i=0; i<man->entities->size; i+=sizeof(entity))
drawEntity(ents+i);
}
“man” es el gestor de entidades, man→entities guarda un vector dinámico dónde se guarda una entidad a lado de otra toda junta en memoria.
Por lo que, la función Vector_getValue me devuelve una entidad en base al indice que le pase, mientras que la otra forma, desreferencia el puntero, para guardar la dirección en una variable local, que apunta a la primer identidad, si le sumo el tamaño (en bytes) pasa a apuntar a la siguiente entidad.
Diria que la forma la Forma 2 es la mejor, trata de ser mas directa; por mi intuición lo que hace “Vector_getValue” es tener un array con todo los Entity que tienes o tener un for que se pare justo en el indice que necesitas, por ese lado prefiero más la Forma 2.
Por lo otro lado no sé si sea un problema pero pongamos un ejemplo: que el tipo entity sea de 64 bytes, cada vez que quiera sumarle el tamaño de entity a i va a ir en 64 en 64, debes de 1 en 1. No sé si ya habias pensado en ello o se te paso, es un pequeño problema el que veo ahí.