Friday, 21 October 2016

Storage Class Specifier

Dalam bahasa C dikenal yang namanya storage class specifier atau bisa dikatakan sebagai penentu kelas penyimpanan. Kita akan merujuk ke storage class specifier menggunakan kata ‘Penentu’. Specifier ini menentukan bagaiman suatu variabel disimpan. Ada empat macam storage class specifier yang didukung oleh C, yaitu:
extern
static
register
auto
Untuk mendeklarasikan variabel yang menggunakan storage specifier, ikut bentuk berikut:
storage_specifier type var_name;
Perhatikan bahwa jenis Penentu ditentukan sebelum menentukan tipe dan nama variabel. Sekarang mari kita bahas satu persatu.
  1. Extern
  2.   Dalam C ataupun C++, ada tiga macam linkage (hubungan) yaitu: external, internal, dan none (tidak ada). Umumnya, fungsi dan global variabel mempunyai hubungan external yang berarti bahwa variabel tersebut tersedia untuk seluruh file yang membentuk program. Objek global yang dideklarasikan sebagai static mempunyai hubungan internal sehingga membuat variabel ini hanya dikenal oleh file dimana dia dideklarasikan. Lokal variabel tidak mempunyai hubungan dan hanya dikenal oleh blok dia dideklarasikan.

      Prinsip penggunaan extern adalah untuk menentukan bahwa suatu objek dideklarasikan dengan hubungan external dibagian lain program. Untuk mengerti hal ini, lebih dahulu anda harus mengerti perbedaan deklarasi dan definisi. Deklarasi menyatakan nama dan tipe suatu objek sedangkan definisi mengakibatkan penyimpanan untuk dialokasikan untuk objek tersebut. Bisa saja ada bermacam – macam deklarasi untuk objek yang sama, tapi hanya satu definisi yang diperbolehkan untuk objek tersebut.

      Secara keseluruhan, deklarasi variabel juga merupakan definisi. Namun, dengan menggunakan penentu extern, variabel bisa dideklarasikan tanpa didefinisikan, yang berarti bahwa ketika dibutuhkan suatu variabel yang didefinisikan di bagian lain di program maka gunakan penentu extern. Perhatikan contoh berikut:
        Dalam program diatas, varSatu dalam main() berbeda dengan variabel global varSatu, begitupun varDua. Jika program di atas dikompile menggunakan VC++, maka akan terjadi compile-time error karena varSatu dan varDua belum di didefinisikan (Pada beberapa kompiler, program di atas mungkin tidak akan menghasilkan compile-time error, melainkan nilai yang ditampilkan adalah garbage value). Agar varSatu dan varDua yang dideklarasikan dalam main() merujuk pada global variabel varSatu dan varDua, gunakan extern:
    extern int varSatu, varDua;
    Kemudian setelah dikompile dan dijalankan, program akan menampilkan:
    varSatu = 1
    varDua = 2

    Bisa dilihat bahwa dengan menggunakan extern, suatu variabel bisa digunakan meskipun belum didefinisikan. Namun tetap saja, jika dalam program dibutuhkan variabel global, maka lebih amannya variabel tersebut dideklarasikan dan didefinisikan lebih di awal program. Juga perlu diingat, bahwa ketika menggunakan extern, variabel yang mengikutinya tidak bisa didefinisikan pada pernyataan yang sama. Misalnya berdasarkan pada contoh di atas, pernyataan:
    extern int varSatu = 10, varDua;
    akan menghasilkan compile-time error. Untuk mengganti nilainya, deklarasi dan pemberian nilai harus dinyatakan secara terpisah.

      Seperti yang telah dijelaskan sebelumnya, dengan menggunakan extern sebuah variabel dideklarasikan tanpa harus didefinisikan. Pada contoh di atas, extern digunakan karena varSatu dan varDua didefinisikan setelah main(). Kegunaan lain extern berhubungan dengan program multi-file. Dalam C/C++, sebuah program bisa saja terdiri dari dua atau lebih file, dikompile terpisah, dan dihubungkan bersama – sama. Dalam kasus seperti ini, dibutuhkan suatu cara agar semua file mengetahu tentang global variabel yang dibutuhkan program. Cara terbaik untuk melakukan hal ini adalah dengan mendeklarasikan semua global variabel dalam satu file dan menggunakan deklarasi extern di file lain yang akan menggunakan global variabel tersebut.

  3. Static
  4.   Variabel static adalah variabel permanen didalam suatu fungsi atau file. Berbeda dengan global variabel, static variabel tidak dikenal diluar fungsi atau filenya. Variabel static menyimpan nilainya selama program berjalan. static mempunyai efek yang berbeda antara lokal variabel dengan global variabel.
    • static lokal variabel
    •   Ketika sebuah lokal variabel diberikan Penentu static, compiler akan membuatkan penyimpanan permanent untuk variabel tersebut sebagaimana dengan global variabel. Bedanya hanya terletak pada scope masing – masing, dimana variabel global dikenal di seluruh bagian program dan variabel lokal hanya dikenal oleh bloknya.

        Dengan menggunakan penentu static pada lokal variabel, nilai variabel tersebut akan terus tersimpan meskipun eksekusi program tidak lagi berada pada blok variabel tersebut. Nilai ini kemudian akan digunakan lagi ketika blok variabel kembali dieksekusi oleh program. Inisialisasi static variabel hanya dilakukan sekali, yaitu pada saat bloknya dieksekusi pertama kali. Perhatikan contoh berikut:   Perhatikan bahwa nilai varStatic selalu tersimpan. Penentu static membuat varStatic hanya diinisialisasi sekali, yaitu pada pemanggilan pertama. Jika seandainya penentu static tidak diberikan pada varStatic, maka nilai yang ditampilkan akan selalu sama dengan 0 karena varStatic diinisialisasikan dengan 0 ketika fungsi dipanggil. Namun perlu diketahui bahwa fungsi di atas akan berbeda jika pendeklarasian varStatic terpisah dengan inisialisasinya, misalnya:
      static int varStatic
      varStatic = 1;
      atau
      static int varStatic = 1;
      varStatic = 1;
        akan selalu menampilkan nilai 1. Pada bentuk yang pertama, varStatic diinisialisaikan dengan garbage value kemudian diberi nilai 1, sehingga angka yang ditampilkan akan selalu sama dengan 1, karena pemberian nilai dieksekusi setiap kali fungsi dipanggil. Pada bentuk yang kedua, meskipun varStatic telah diinisialisaikan dengan 1, pemberian nilai pada baris selanjutnya tetap dijalankan setiap kali fungsi dipanggil.

    • static global variabel
    •   Memberikan penanda static pada global variabel membuat variabel tersebut hanya dikenal oleh file dimana dia dideklarasikan, file lain tidak akan mengetahui apa – apa tentang variabel ini. Perlu diperhatikan bahwa jika suatu global variabel dideklarasikan dalam suatu header, meskipun dengan static, variabel tersebut tetap dikenal oleh file yang meng-include-kan header tersebut.

  5. register
  6.   Awalnya penentu register ini hanya boleh digunakan pada tipe int, char, dan pointer. Akan tetapi, dewasa ini penggunaannya telah dikembangkan sehingga bisa digunakan untuk semua tipe.

      Pada umumnya, variabel disimpan dalam memori sehingga CPU membutuhkan akses ke memori agar variabel dapat digunakan. Dengan menggunakan penentu register, variabel disimpan dalam CPU. Operasi yang menggunakan register variabel akan berlangsung lebih cepat dibanding dengan variabel biasa karena variabel bisa langsung diakses dari CPU.

      Dewasa ini, definisi register mengalami perluasan yang signifikan sehingga bisa digunakan untuk semua tipe data. Objek yang berukuran besar misalnya array tidak bisa disimpan dalam register, begitupun dengan variabel global. Implementasi register juga tergantung pada kompiler C/C++ dan lingkungan operasi. Faktanya, bisa saja sebuah compiler menghiraukan register dan menganggap variabel sebagai variabel normal.

    Penentu register bisa digunakan pada lokal dan formal parameter. Berikut ini contoh penggunaan register:   Dalam contoh di atas, angka, pangkat, dan temp dideklarasikan sebagai register. Kenyataan bahwa dengan register variabel operasi bisa berjalan lebih cepat membuat loop di atas akan lebih cepat di proses dibanding dengan menggunakan kontrol variabel biasa. Umumnya, register digunakan pada bagian yang membutuhkan banyak referensi ke variabel yang sama. Juga penting untuk diketahui bahwa akses ke register variabel bisa saja memberikan kecepatan akses yang berbeda.

      Tidak ada batasan berapa banyak variabel yang bisa diberikan penentu register, jika register telah terisi penuh, maka secara otomatis variabel tersebut akan dialihkan ke memori dan dianggap sebagai variabel biasa. Banyaknya variabel yang bisa disimpan di resgister tergantung pada compiler dan lingkungan operasi. Namun biasanya, paling sedikit dua variabel tipe int dan char bisa disimpan dalam register.

      Dalam C, alamat variabel dalam register bisa dilihat menggunakan operator &, tapi hal ini tidak berlaku dalam C++. Meskipun Penentu register bisa digunakan untuk semua tipe, namun efek yang signifikan umumnya hanya didapatkan pada tipe integer dan karakter.

No comments:

Post a Comment