- Definición de estructuras
- Funciones (métodos) de estructuras
- Copiar estructuras
- Constructores y destructores
- Empaquetar estructuras en memoria e interactuar con DLLs
- Herencia y disposición de estructuras
- Derechos de acceso
- Uniones
Empaquetar estructuras en memoria e interactuar con DLLs
Para almacenar una instancia de la estructura se asigna en la memoria un área contigua suficiente para albergar todos los elementos.
A diferencia de C++, aquí los elementos de la estructura se suceden uno detrás de otro en la memoria y no se alinean en el límite de 2, 4, 8 o 16 bytes, dependiendo del tamaño de los propios elementos (los algoritmos de alineación difieren según los distintos compiladores y modos operativos). La alineación de elementos, cuyo tamaño es menor que el del bloque especificado, se realiza añadiendo variables ficticias no utilizadas a la composición de la estructura (el programa no tiene acceso directo a ellas). La alineación se utiliza para optimizar el rendimiento de la memoria.
MQL5 permite cambiar las reglas de alineación si es necesario, principalmente cuando se integran programas MQL con DLLs de terceros que describen tipos específicos de estructuras. Para ellos es necesario preparar una descripción equivalente en MQL5 (véase la sección sobre importación de bibliotecas). Es importante señalar que las estructuras destinadas a la integración sólo deben tener en su definición campos de un conjunto limitado de tipos. Por lo tanto, no pueden utilizar cadenas, arrays dinámicos, objetos de clase y punteros a objetos de clase.
La alineación se controla mediante la palabra clave pack añadida a la cabecera de la estructura. Existen dos opciones:
struct pack(size) identifier
|
En ambos casos, el tamaño es un número entero 1, 2, 4, 8, 16. O bien, puede utilizar el operador sizeof(built-in_type) como tamaño; por ejemplo, sizeof(double).
La opción pack(1), es decir, la alineación de bytes, es idéntica al comportamiento por defecto sin el modificador pack.
El operador especial offsetof() permite averiguar el desplazamiento en bytes de un elemento concreto de la estructura desde su inicio. Tiene 2 parámetros: objeto de estructura e identificador de elemento. Por ejemplo:
Print(offsetof(Result, status)); // 36 |
Delante del campo status en la estructura Result hay 4 valores double y un valor int: 36 en total.
Cuando diseñe sus propias estructuras se recomienda que coloque primero los elementos más grandes y luego el resto, en orden decreciente de tamaño.