Share via


Pengualifikasi Tipe

Pengualifikasi tipe memberikan salah satu dari dua properti ke pengidentifikasi. Pengualifikasi tipe const mendeklarasikan sebuah objek sebagai sesuatu yang tidak dapat dimodifikasi. Pengualifikasi tipe volatile mendeklarasikan item yang nilainya dapat diubah secara sah oleh sesuatu di luar kendali program tempat item tersebut muncul, seperti utas yang dieksekusi secara bersamaan.

Pengualifikasi tipe, const, restrict, dan volatile, hanya dapat muncul sekali dalam sebuah deklarasi. Pengualifikasi tipe dapat muncul dengan penentu tipe apa pun; namun, mereka tidak dapat muncul setelah koma pertama dalam deklarasi multi-item. Sebagai contoh, deklarasi berikut adalah sah:

typedef volatile int VI;
const int ci;

Deklarasi berikut tidak sah:

typedef int *i, volatile *vi;
float f, const cf;

Pengualifikasi tipe hanya relevan saat mengakses pengidentifikasi sebagai nilai-l dalam ekspresi. Lihat Ekspresi Nilai-L dan Nilai-R untuk informasi tentang nilai-l dan ekspresi.

Sintaks

type-qualifier:
const
restrict
volatile

const dan volatile

Berikut ini adalah deklarasi const dan volatile yang sah:

int const *p_ci;      // Pointer to constant int
int const (*p_ci);   // Pointer to constant int
int *const cp_i;     // Constant pointer to int
int (*const cp_i);   // Constant pointer to int
int volatile vint;     // Volatile integer

Jika spesifikasi tipe array menyertakan pengualifikasi tipe, elemen tersebut memenuhi syarat, bukan tipe array. Jika spesifikasi tipe fungsi menyertakan pengualifikasi, perilakunya tidak terdefinisi. volatile dan const tidak memengaruhi rentang nilai atau properti aritmatika objek.

  • Kata kunci const dapat digunakan untuk mengubah tipe dasar atau agregat apa pun, atau penunjuk ke objek tipe apa pun, atau typedef. Jika sebuah item dideklarasikan hanya dengan pengualifikasi tipe const, tipenya diambil sebagai const int. Variabel const dapat diinisialisasi atau ditempatkan di wilayah penyimpanan baca-saja. Kata kunci const berguna untuk mendeklarasikan penunjuk ke const karena hal ini membutuhkan fungsi untuk tidak mengubah penunjuk dengan cara apa pun.

  • Kompilator mengasumsikan bahwa, pada titik mana pun dalam program, variabel volatile dapat diakses oleh proses yang tidak diketahui yang menggunakan atau memodifikasi nilainya. Terlepas dari pengoptimalan yang ditentukan pada baris perintah, kode untuk setiap penugasan ke atau referensi variabel volatile harus dibuat meskipun tampaknya tidak berpengaruh.

Jika volatile digunakan sendiri, int diasumsikan. Penentu tipe volatile dapat digunakan untuk menyediakan akses yang andal ke lokasi memori khusus. Gunakan volatile dengan objek data yang dapat diakses atau diubah oleh penangan sinyal, dengan menjalankan program secara bersamaan, atau dengan perangkat keras khusus, seperti register kontrol I/O yang dipetakan memori. Anda dapat mendeklarasikan variabel sebagai volatile selama masa pakainya, atau Anda dapat menggunakan satu referensi sebagai volatile.

  • Sebuah item dapat berupa const dan volatile, dalam hal ini item tidak dapat dimodifikasi secara sah oleh programnya sendiri, tetapi dapat dimodifikasi oleh beberapa proses asinkron.

restrict

Pengualifikasi tipe restrict, yang diperkenalkan dalam C99 dan tersedia dalam mode /std:c11 atau /std:c17, dapat diterapkan ke deklarasi penunjuk. Pengualifikasi tersebut mengualifikasi penunjuk, bukan apa yang ditunjuknya.

restrict adalah petunjuk pengoptimalan untuk kompilator bahwa tidak ada penunjuk lain dalam cakupan saat ini yang merujuk ke lokasi memori yang sama. Artinya, hanya penunjuk atau nilai yang diturunkan darinya (seperti penunjuk + 1) yang digunakan untuk mengakses objek selama masa pakai penunjuk. Hal ini membantu kompilator untuk menghasilkan kode yang lebih optimal. C++ memiliki mekanisme yang setara, yaitu __restrict

Perlu diingat bahwa restrict adalah kontrak antara Anda dan kompilator. Jika Anda melakukan alias penunjuk yang ditandai dengan restrict, hasilnya tidak terdefinisi.

Berikut contoh yang menggunakan restrict:

void test(int* restrict first, int* restrict second, int* val)
{
    *first += *val;
    *second += *val;
}

int main()
{
    int i = 1, j = 2, k = 3;
    test(&i, &j, &k);

    return 0;
}

// Marking union members restrict tells the compiler that
// only z.x or z.y will be accessed in any scope, which allows
// the compiler to optimize access to the members.
union z 
{
    int* restrict x;
    double* restrict y;
};

Lihat juga

/std (Menentukan Versi Standar Bahasa)
Deklarasi dan Tipe