Compartir a través de


Alineación

Los problemas de alineación de una aplicación ODBC generalmente no son diferentes de los que se encuentran en ninguna otra aplicación. Es decir, la mayoría de las aplicaciones ODBC tienen pocos o ningún problema con la alineación. Las sanciones por no alinear direcciones varían con el hardware y el sistema operativo y pueden ser tan menores como una ligera penalización de rendimiento o como un error grave en tiempo de ejecución. Por lo tanto, las aplicaciones ODBC y las aplicaciones ODBC portátiles en particular deben tener cuidado de alinear los datos correctamente.

Un ejemplo de cuándo las aplicaciones ODBC encuentran problemas de alineación es cuando asignan un bloque de memoria grande y enlazan diferentes partes de esa memoria a las columnas de un conjunto de resultados. Esto es más probable que se produzca cuando una aplicación genérica debe determinar la forma de un conjunto de resultados en tiempo de ejecución y asignar y enlazar memoria en consecuencia.

Por ejemplo, supongamos que una aplicación ejecuta una instrucción SELECT especificada por el usuario y captura los resultados de esta instrucción. Dado que la forma de este conjunto de resultados no se conoce cuando se escribe el programa, la aplicación debe determinar el tipo de cada columna después de crear el conjunto de resultados y enlazar la memoria en consecuencia. La manera más fácil de hacerlo es asignar un bloque grande de memoria y enlazar direcciones diferentes en ese bloque a cada columna. Para acceder a los datos de una columna, la aplicación convierte la memoria enlazada a esa columna.

En el diagrama siguiente se muestra un conjunto de resultados de ejemplo y cómo se puede enlazar un bloque de memoria con el tipo de datos C predeterminado para cada tipo de datos SQL. Cada "X" representa un solo byte de memoria. (En este ejemplo solo se muestran los búferes de datos enlazados a las columnas. Esto se hace por motivos de simplicidad. En el código real, los búferes de longitud o indicador también deben alinearse).

Binding by default C data type to SQL data type

Suponiendo que las direcciones enlazadas se almacenan en la matriz Address, la aplicación usa las siguientes expresiones para acceder a la memoria enlazada a cada columna:

(SQLCHAR *)       Address[0]  
(SQLSMALLINT *)   Address[1]  
(SQLINTEGER *)    Address[2]  

Observe que las direcciones enlazadas a la segunda y tercera columna comienzan en bytes impares y que la dirección enlazada a la tercera columna no es divisible por cuatro, que es el tamaño de un SDWORD. En algunas máquinas, esto no será un problema; en otros, provocará una ligera penalización de rendimiento; en otros, provocará un error grave en tiempo de ejecución. Una mejor solución sería alinear cada dirección enlazada en su límite de alineación natural. Suponiendo que es 1 para un UCHAR, 2 para una ESPADA y 4 para un SDWORD, esto daría el resultado mostrado en la ilustración siguiente, donde un "X" representa un byte de memoria que se usa y un "O" representa un byte de memoria que no se usa.

Binding by natural alignment boundary

Aunque esta solución no usa toda la memoria de la aplicación, no encuentra ningún problema de alineación. Desafortunadamente, se necesita una cantidad razonable de código para implementar esta solución, ya que cada columna debe alinearse individualmente según su tipo. Una solución más sencilla es alinear todas las columnas en el tamaño del límite de alineación más grande, que es 4 en el ejemplo que se muestra en la ilustración siguiente.

Binding by largest alignment boundary

Aunque esta solución deja agujeros más grandes, el código para implementarlo es relativamente sencillo y rápido. En la mayoría de los casos, esto desplaza la penalización pagada en memoria no utilizada. Para obtener un ejemplo que use este método, consulte Uso de SQLBindCol.