size_is 属性

[size_is] 属性を使用して、サイズの大きさのポインターに割り当てられたメモリのサイズを要素単位で指定し、サイズ設定されたポインターにサイズを設定したポインター、および単一配列または多次元配列を指定します。

[ size_is(limited-expression-list) ]

パラメーター

limited-expression-list

1 つ以上の C 言語式を指定します。 各式は、サイズの大きなポインターまたは配列に割り当てられたメモリの量を表す負以外の整数に評価されます。 配列の場合は、その配列の最初の次元の割り当てサイズを要素単位で表す単一の式を指定します。 MIDL コンパイラでは、条件式、論理式、リレーショナル式、および算術式がサポートされています。 MIDL では、式での関数呼び出しは許可されず、インクリメント演算子とデクリメント演算子は許可されません。 暗黙的なパラメーターのプレースホルダーとしてコンマを使用するか、複数の式を区切ります。

解説

[size_is] 属性を使用して多次元配列のメモリを割り当て、配列 [ ] 表記を使用している場合は、実行時に動的に決定できるのは多次元配列の最初の次元であることに注意してください。 他のディメンションは静的に指定する必要があります。 Proc7 の例に示すように、[size_is] 属性を複数レベルのポインターで使用して、サーバーがクライアントに動的にサイズ設定されたデータ配列を返せるようにする方法の詳細については、「 複数レベルのポインター」を参照してください。

[size_is] または max_is (ただし、両方とも同じ属性リストに含まれていない) を使用して、実行時に上限が決定される配列のサイズを指定できます。 ただし、[size_is] 属性は、固定されている配列ディメンションでは使用できないことに注意してください。 [max_is] 属性は、有効な配列インデックスの最大数を指定します。 その結果、[size_is(n)] を指定することは、[max_is(n-1)]を指定することと同じです。

[文字列] 属性を持つ [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. */

関連項目

配列

フィールド属性

first_is

インターフェイス定義 (IDL) ファイル

インチ

last_is

length_is

max_is

min_is

string