size_is (atributo)
Use el atributo [size_is] para especificar el tamaño de la memoria, en elementos, asignados a punteros de tamaño, punteros de tamaño a punteros de tamaño y matrices de un solo o multidimensional.
[ size_is(limited-expression-list) ]
Parámetros
-
limited-expression-list
-
Especifica una o varias expresiones de lenguaje C. Cada expresión se evalúa como un entero no negativo que representa la cantidad de memoria asignada a un puntero de tamaño o una matriz. En el caso de una matriz, especifica una única expresión que representa el tamaño de asignación, en elementos, de la primera dimensión de esa matriz. El compilador MIDL admite expresiones condicionales, expresiones lógicas, expresiones relacionales y expresiones aritméticas. MIDL no permite invocaciones de función en expresiones y no permite operadores de incremento y decremento. Use comas como marcadores de posición para parámetros implícitos o para separar varias expresiones.
Comentarios
Si usa el atributo [size_is] para asignar memoria para una matriz multidimensional y usa la notación array [ ] , tenga en cuenta que solo la primera dimensión de una matriz multidimensional se puede determinar dinámicamente en tiempo de ejecución. Las demás dimensiones deben especificarse estáticamente. Para obtener más información sobre el uso del atributo [size_is] con varios niveles de punteros para permitir que un servidor devuelva una matriz de datos de tamaño dinámico a un cliente, como se muestra en el ejemplo Proc7, vea Varios niveles de punteros.
Puede usar [size_is] o max_is (pero no ambos en la misma lista de atributos) para especificar el tamaño de una matriz cuyos límites superiores se determinan en tiempo de ejecución. Sin embargo, tenga en cuenta que el atributo [size_is] no se puede usar en dimensiones de matriz fijas. El atributo [max_is] especifica el índice de matriz válido máximo. Como resultado, especificar [size_is(n)] equivale a especificar [max_is(n-1)].
Un parámetro de matriz conforme [ in] o [ in, out] con el atributo [ string] no necesita tener el atributo [size_is] o [max_is]. En este caso, el tamaño de la asignación se determina a partir del terminador NULL de la cadena de entrada. Todas las demás matrices compatibles con el atributo [string] deben tener un atributo [size_is] o [max_is].
Aunque es legal usar el atributo [size_is] con una constante, hacerlo es ineficaz e innecesario. Por ejemplo, use una matriz de tamaño fijo:
HRESULT Proc3([in] short Arr[MAX_SIZE]);
en lugar de:
// legal but marshaling code is much slower
HRESULT Proc3([in size_is(MAX_SIZE)] short Arr[] );
Puede usar los atributos [size_is] y [length_is] juntos. Al hacerlo, el atributo [size_is] controla la cantidad de memoria asignada para los datos. El atributo [length_is] especifica cuántos elementos se transmiten. La cantidad de memoria especificada por los atributos [size_is] y [length_is] no deben ser iguales. Por ejemplo, el cliente puede pasar un parámetro [in,out] a un servidor y especificar una asignación de memoria grande con [size_is], aunque especifica un pequeño número de elementos de datos que se van a pasar con [length_is]. Esto permite al servidor rellenar la matriz con más datos de los que recibió, que luego puede devolver al cliente.
En general, no es útil especificar [size_is] y [length_is] en los parámetros [in] o [out]. En ambos casos, [size_is] controla la asignación de memoria. La aplicación podría usar [size_is] para asignar más elementos de matriz de los que transmite (según lo especificado por [length_is]). Sin embargo, esto sería ineficaz. También sería ineficaz especificar valores idénticos para [size_is] y [length_is]. Crearía una sobrecarga adicional durante la serialización de parámetros. Si los valores de [size_is] y [length_is] siempre son los mismos, omita el atributo [length_is].
Ejemplos
HRESULT Proc1(
[in] short m;
[in, size_is(m)] short a[]); // If m = 10, a[10]
HRESULT Proc2(
[in] short m;
[in, size_is(m)] short b[][20]); // If m = 10, b[10][20]
HRESULT Proc3(
[in] short m;
[size_is(m)] short * pshort); /* Specifies a pointer
to an m-sized block of shorts */
HRESULT Proc4(
[in] short m;
[size_is( , m)] short ** ppshort); /* Specifies a pointer
to a pointer to an m-sized
block of shorts */
HRESULT Proc5(
[in] short m;
[size_is(m ,)] short ** ppshort); /* Specifies an
m-sized block of pointers
to shorts */
HRESULT Proc6(
[in] short m;
[in] short n;
[size_is(m,n)] short ** ppshort); /* Specifies a pointer to an
m-sized block of pointers, each
of which points to an n-sized
block of shorts. m associates with
the pointer closeest to the identifer
it decorates. n associates with rest.*/
HRESULT Proc7(
[out] long * pSize,
[out, size_is( , *pSize)] my_type ** ppMyType); /* Specifies a pointer
to a sized pointer,
which points to a block
of my_types, whose size is
unknown when the stub
calls the server. */
Vea también