size_is 特性
使用 [size_is] 属性可以指定内存的大小,以元素为单位,为大小指针分配,大小指针分配给大小指针,以及单维或多维数组。
[ size_is(limited-expression-list) ]
-
limited-expression-list
-
指定一个或多个 C 语言表达式。 每个表达式的计算结果为一个非负整数,该整数表示分配给大小指针或数组的内存量。 对于数组, 指定一个表达式,该表达式表示该数组第一个维度的分配大小(以元素为单位)。 MIDL 编译器支持条件表达式、逻辑表达式、关系表达式和算术表达式。 MIDL 不允许表达式中的函数调用,也不允许递增和递减运算符。 使用逗号作为隐式参数的占位符,或分隔多个表达式。
如果使用 [size_is] 属性为多维数组分配内存,并且使用的是 array [ ] 表示法,请记住,在运行时只能动态确定多维数组的第一个维度。 其他维度必须静态指定。 有关将 [size_is] 属性与多个级别的指针配合使用以使服务器能够将动态大小的数据数组返回给客户端的详细信息,如示例 Proc7 中所示,请参阅 多级别指针。
可以使用 [size_is] 或 max_is (,但不能同时在同一属性列表中) 来指定在运行时确定其上限的数组的大小。 但请注意,[size_is] 属性不能用于固定的数组维度。 [max_is] 属性指定最大有效数组索引。 因此,指定 [size_is (n) ] 等效于指定 [max_is (n-1) ]。
具有 [ string] 属性的 [ in] 或 [in, out] 符合数组参数不需要具有 [size_is] 或 [max_is] 属性。 在这种情况下,分配的大小取决于输入字符串的 NULL 终止符。 具有 [string] 属性的所有其他符合数组必须具有 [size_is] 或 [max_is] 属性。
虽然将 [size_is] 属性与常量一起使用是合法的,但这样做效率低下且不必要。 例如,使用固定大小的数组:
HRESULT Proc3([in] short Arr[MAX_SIZE]);
而不是:
// legal but marshaling code is much slower
HRESULT Proc3([in size_is(MAX_SIZE)] short Arr[] );
可以将 [size_is] 和 [length_is] 属性一起使用。 执行此操作时,[size_is] 属性控制为数据分配的内存量。 [length_is] 属性指定传输的元素数。 [size_is] 和 [length_is] 属性指定的内存量不需要相同。 例如,客户端可以向服务器传递 [in,out] 参数,并使用 [size_is] 指定大型内存分配,即使它指定要通过 [length_is] 传递的少量数据元素。 这使服务器能够用比收到的更多的数据填充数组,然后可以将其发送回客户端。
通常,在 [in] 或 [out] 参数上同时指定 [size_is] 和 [length_is] 没有用。 在这两种情况下,[size_is] 控制内存分配。 应用程序可以使用 [size_is] 分配比 [length_is] ) 指定的传输 (更多的数组元素。 但是,这将效率低下。 为 [size_is] 和 [length_is] 指定相同的值也效率低下。 这会在参数封送处理期间产生额外的开销。 如果 [size_is] 和 [length_is] 的值始终相同,请省略 [length_is] 属性。
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. */