size_is 特性

使用 [size_is] 属性可以指定为大小指针分配的内存大小、为大小指针分配的指针以及单维或多维数组。

[ size_is(limited-expression-list) ]

参数

limited-expression-list

指定一个或多个 C 语言表达式。 每个表达式的计算结果为一个非负整数,表示分配给大小指针或数组的内存量。 在数组中,指定表示该数组第一个维度的分配大小(以元素为单位)的单个表达式。 MIDL 编译器支持条件表达式、逻辑表达式、关系表达式和算术表达式。 MIDL 不允许表达式中的函数调用,不允许递增和递减运算符。 将逗号用作隐式参数的占位符,或分隔多个表达式。

注解

如果使用 [size_is] 属性为多维数组分配内存,并且使用的是数组 [] 表示法,请记住,在运行时只能动态确定多维数组的第一个维度。 必须静态指定其他维度。 有关将 [size_is] 属性与多个指针级别配合使用的详细信息,使服务器能够将动态大小的数据数组返回到客户端,如示例 Proc7 所示,请参阅 多个指针级别

可以使用 [size_is] 或 max_is ( ,但不能同时在同一属性列表中) 指定在运行时确定上限的数组的大小。 但是,请注意,不能对固定的数组维度使用 [size_is] 属性。 [max_is] 属性指定最大有效数组索引。 因此,指定 [size_is (n) ] 等效于指定 [max_is (n-1) ]。

具有 [string] 属性的 [in] 或 [in] 一致性数组参数不需要 [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. */

另请参阅

阵 列

字段属性

first_is

接口定义 (IDL) 文件

in

last_is

length_is

max_is

min_is

out

字符串