Costes ocultos en arrays de estructuras en C

Continuamos nuestra serie abordando los costes ocultos al usar arrays de estructuras en C en Amstrad CPC. Las posiciones en memoria son relativas al inicio de los arrays, y el compilador produce código para calcular dónde está cada elemento. Las estructuras funcionan similar: cada miembro está a una distancia en bytes del inicio de la estructura. Trabajamos sobre un ejemplo en CPCtelera que vamos optimizando progresivamente. Primero entendemos cómo son estos cálculos y el código que el compilador genera para realizarlos. Vemos las limitadas posibilidades que tiene el compilador para optimizar, debido a los pocos registros del procesador Z80. Finalmente, le vamos facilitando la vida, simplificando los cálculos y ganando bytes y tiempo de CPU con sencillos cambios en el código.

Nuestro ejemplo simula una sencilla estructura de datos para almacenar entidades de un videojuego cualquiera. Nuestras entidades cuentan con posición x e y, energía, un estado y un sprite para dibujarse. Declaramos la estructura de entidad y creamos un array para almacenar 10 entidades. Como cada entidad nos ocupa 7 bytes, nuestro array inicialmente ocupará 70 bytes. Sin embargo, lo que más nos preocupa no es lo que ocupan las entidades, sino lo que ocupa el código que utilizaremos para inicializar los valores de estas entidades. Es muy habitual utilizar algún tipo de bucle o función que vaya dando un valor a cada uno de los miembros de la estructura. Eso es lo que simulamos en nuestro código siguiente: