sizeof işleci – 1

C dilinin anahtar sözcüklerinden biri olan sizeof bir işleç görevindedir. Tek terimli olan ve önek konumunda (unary prefix) bulunan sizeof işleci, bir nesnenin bellekte kaç byte yer kapladığı değerini üretir. Bu işlecin ürettiği değer, derleme zamanında derleyici için bir sabit ifadesidir. sizeof işlecinin ürettiği değer standart bir typedef ismi olan size_t türündendir. size_t türü derleyiciye bağlı olarak seçilen bir işaretsiz tamsayı türüdür. size_t türü derleyiciler tarafından unsigned int, unsigned long ya da unsigned long long türlerinden birinin typedef ismi olarak seçilebilir. size_t türünün typedef bildirimi C‘nin stddef.h isimli başlık dosyasında yapılmıştır.

sizeof işleci iki ayrı şekilde kullanılabilir:

i) İşlecin terimi olarak bir tür bilgisi kullanılabilir. Bu durumda terimin parantez içine alınması zorunludur:

İşleç bu durumda terimi olan türden bir nesnenin kullanılan sistemde, bellekte kaç byte yer kapladığı değerini üretir. Örneğin Windows ya da UNIX sistemlerinde

ifadesinin değeri 4‘dür.

ii)  İşlecin terimi olarak herhangi bir ifade kullanılabilir. Bu durumda terimin parantez içine alınması zorunlu değildir. Ancak programcıların çoğu okunabilirlik açısından işlecin terimi olan ifadeyi parantez içine almayı yeğler:

Yukarıdaki kodda

sizeof işlecinin terimi olan ifade double türdendir. Bu yüzden bu ifadenin değeri

ifadesinin değerine eşittir.

Bir dizinin ismi sizeof işlecinin terimi olduğunda, derleyici dizi ismini dizinin ilk öğesinin adresine dönüştürmez. sizeof işleci bu durumda dizinin bellekte kaç byte yer kapladığı değerini üretir. Aşağıdaki koda bakalım:

Benim çalıştığım sistemde bu programı derleyip çalıştırdığımda programın çıktısı şu şekilde oldu:

Dizi için elde edilen sizeof değerini dizinin bir öğesi için elde edilen sizeof değerine bölersek bir derleme zamanı sabiti olarak dizinin boyutunu buluruz:

a herhangi türden bir dizi olsun. Bu durumda

bir sabit ifadesidir ve bu ifadenin değeri a dizisinin boyutudur. Dizinin bir öğesini bir ifade olarak kullanmak için içerik (dereferencing) işleci de kullanılabilir:

ifadesinin değeri yine a dizisinin boyutudur:

Dizi tanımlamalarında, ilk değer verilen dizilerin boyutlarının belirtilmeyebileceği, derleyicinin dizi boyutunu verilen ilk değerlerin sayısından çıkardığını biliyorsunuz. Aşağıdaki kodu inceleyin:

main işlevi içinde tanımlanan int türden a isimli dizi boyutu belirtilmeden ilk değer verilerek tanımlanmış. Bu durumda derleyici verilen ilk değerlerin sayısını sayarak dizinin boyutunu 8 kabul eder. main işlevi içinde yer alan for döngü deyimi, dizinin eleman sayısı kadar, yani 8 kez döner. Şimdi kaynak kodda değişiklik yapıldığını, a dizisine birkaç öğe daha eklendiğini düşünelim:

Bu durumda for döngü deyiminde bir değişiklik yapılmasına gerek kalmaz. Çünkü derleyici bu kez derleme zamanında dizinin boyutunu 11 olarak hesaplar ve for döngü deyimi içinde kullanılan

ifadesi de bu kez 11 değerini üretir.

sizeof işleci ile dizi boyutunu elde eden ifade okuma ve yazma kolaylığı sağlaması için çoğunlukla bir işlevsel makro olarak kullanılır:

sizeof işlecinin önceliği
Tek terimli tüm işleçlerin, daha önce oluşturduğumuz işleç öncelik tablosunun ikinci seviyesinde yer aldığını biliyorsunuz. sizeof da ikinci seviyede bulunan bir işleçtir:

Yukarıdaki kod int türünün 4 byte olduğu bir sistemde derleniyor olsun:

ifadesinin değeri 9 iken

ifadesinin değeri 4’tür.

sizeof işlecinin terimi olan ifadenin yan etkisi

sizeof işlecinin terimi olan ifade değerlendirilmez. Derleyici işlecin terimi olan ifadeyi derleme zamanında bir tür bilgisi olarak ele alır ve bu ifade için bir işlem kodu üretmez.

Yukarıdaki kodda main işlevi içinde x değişkeni arttırılmaz

ifadesi int türdendir. Derleyici bu ifadeyi yalnızca bir tür bilgisi olarak ele alır. İfadenin türü int olduğundan y değişkenine sizeof(int) değeri atanır. Yine örnek kodda yer alan func işlevi çağrılmayacaktır.

ifadesi int türdendir. Derleyici yine bu ifadeyi yalnızca bir tür bilgisi olarak ele alır. İfadenin türü int olduğundan z değişkenine sizeof(int) değeri atanır

sizeof işlecinin ürettiği değer derleme zamanında elde edildiğinden bir sabit ifadesidir. Bu yüzden bu değer sabit ifadesi gereken her yerde kullanılabilir:

sizeof işleci ne amaçla kullanılır?
Belirli bir türden nesne için bellekte ne büyüklükte bir bellek alanına gereksinim duyulacağı sistemden sisteme farklılık gösterebilir. Tür uzunluklarının sistemden sisteme farklı olabilmesi bazı uygulamalarda taşınabilirlik sorunlarına yol açabilir. sizeof işlecinin, genel olarak bu tür taşınabilirlik sorunlarını ortadan kaldırmaya yönelik olarak kullanıldığı söylenebilir.

Necati Ergin

C ve Sistem Programcıları Derneğinde eğitmen olarak çalışıyor.

Bunlar da ilginizi çekebilir

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Kod Eklemek İçin Okuyun