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

Array

Atribut Bidang

first_is

File Definisi Antarmuka (IDL)

In

last_is

length_is

max_is

min_is

Out ekspres

string