size_is 특성
[size_is] 특성을 사용하여 크기가 큰 포인터, 크기가 큰 포인터에 할당된 메모리 크기(요소) 및 단일 또는 다차원 배열을 지정할 수 있습니다.
[ size_is(limited-expression-list) ]
-
limited-expression-list
-
하나 이상의 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] 특성으로 지정된 메모리 양은 동일하지 않아도 됩니다. instance 경우 클라이언트는 [length_is]와 함께 전달할 소수의 데이터 요소를 지정하더라도 서버에 [in,out] 매개 변수를 전달하고 [size_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. */