atribut size_is
Gunakan atribut [size_is] untuk menentukan ukuran memori, dalam elemen, yang dialokasikan untuk penunjuk berukuran, penunjuk berukuran ke penunjuk berukuran, dan array tunggal atau multidimensi.
[ size_is(limited-expression-list) ]
Parameter
-
daftar ekspresi terbatas
-
Menentukan satu atau beberapa ekspresi bahasa C. Setiap ekspresi mengevaluasi ke bilangan bulat non-negatif yang mewakili jumlah memori yang dialokasikan ke penunjuk berukuran atau array. Dalam kasus array, menentukan ekspresi tunggal yang mewakili ukuran alokasi, dalam elemen, dari dimensi pertama array tersebut. Kompilator MIDL mendukung ekspresi kondisional, ekspresi logis, ekspresi relasional, dan ekspresi aritmatika. MIDL tidak mengizinkan pemanggilan fungsi dalam ekspresi dan tidak memungkinkan operator kenaikan dan penurunan. Gunakan koma sebagai tempat penampung untuk parameter implisit, atau untuk memisahkan beberapa ekspresi.
Keterangan
Jika Anda menggunakan atribut [size_is] untuk mengalokasikan memori untuk array multidmensional dan Anda menggunakan notasi array [ ] , perlu diingat bahwa hanya dimensi pertama array multidmensional yang dapat ditentukan secara dinamis pada durasi. Dimensi lainnya harus ditentukan secara statis. Untuk informasi selengkapnya tentang menggunakan atribut [size_is] dengan beberapa tingkat pointer untuk memungkinkan server mengembalikan array data berukuran dinamis ke klien, seperti yang ditunjukkan dalam contoh Proc7, lihat Beberapa Tingkat Penunjuk.
Anda dapat menggunakan [size_is] atau max_is (tetapi tidak keduanya dalam daftar atribut yang sama) untuk menentukan ukuran array yang batas atasnya ditentukan pada durasi. Namun, perhatikan bahwa atribut [size_is] tidak dapat digunakan pada dimensi array yang diperbaiki. Atribut [max_is] menentukan indeks array maksimum yang valid. Akibatnya, menentukan [size_is(n)] setara dengan menentukan [max_is(n-1)].
Parameter [ in] atau [in, out] conformant-array dengan atribut [ string] tidak perlu memiliki atribut [size_is] atau [max_is]. Dalam hal ini, ukuran alokasi ditentukan dari terminator NULL dari string input. Semua array yang sesuai lainnya dengan atribut [string] harus memiliki atribut [size_is] atau [max_is].
Meskipun legal untuk menggunakan atribut [size_is] dengan konstanta, melakukannya tidak efisien dan tidak perlu. Misalnya, gunakan array ukuran tetap:
HRESULT Proc3([in] short Arr[MAX_SIZE]);
Melainkan:
// legal but marshaling code is much slower
HRESULT Proc3([in size_is(MAX_SIZE)] short Arr[] );
Anda dapat menggunakan atribut [size_is] dan [length_is] bersama-sama. Saat Anda melakukannya, atribut [size_is] mengontrol jumlah memori yang dialokasikan untuk data. Atribut [length_is] menentukan berapa banyak elemen yang ditransmisikan. Jumlah memori yang ditentukan oleh atribut [size_is] dan [length_is] tidak perlu sama. Misalnya, klien Anda dapat meneruskan parameter [in,out] ke server dan menentukan alokasi memori besar dengan [size_is], meskipun menentukan sejumlah kecil elemen data yang akan diteruskan dengan [length_is]. Ini memungkinkan server untuk mengisi array dengan lebih banyak data daripada yang diterimanya, yang kemudian dapat dikirim kembali ke klien.
Secara umum, tidak berguna untuk menentukan parameter [size_is] dan [length_is] pada parameter [in] atau [out]. Dalam kedua kasus, [size_is] mengontrol alokasi memori. Aplikasi Anda dapat menggunakan [size_is] untuk mengalokasikan lebih banyak elemen array daripada yang dikirimkan (seperti yang ditentukan oleh [length_is]). Namun, ini tidak akan efisien. Juga tidak efisien untuk menentukan nilai yang identik untuk [size_is] dan [length_is]. Ini akan membuat overhead ekstra selama marshaling parameter. Jika nilai [size_is] dan [length_is] selalu sama, hilangkan atribut [length_is].
Contoh
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. */
Lihat juga