Parametreler pointer olarak mi tanimlanmali?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Glen
Üye
Mesajlar: 277
Kayıt: 12 Eki 2005 11:58

Parametreler pointer olarak mi tanimlanmali?

Mesaj gönderen Glen »

Merhaba,

En ufak bir procedure, en ufak bir function icin bile, parametrelerinizi tanimlarken pointer seklindemi tanimliyorsunuz?

Mesela,

Kod: Tümünü seç

function Topla(x, y : PInteger) : integer;
begin
   result := x^+y^;
end;
Yukaridaki verdigim ornek zaten basli basina gereksiz toplama islemi icin :) Ancak demek istedigim cok cok cok ufak islemler icin bile, parametreleri pointer tanimlamak sizce memory icin daha sagliklimi?

Iyi calismalar, kolay gelsin.
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

Integer'da Pointer'da 4 byte yer kapladığı için işi dolaylı yoldan uzatmaya gerek yok. Bence hiç kasma direk kendi tipinde tanımla. Eğer değer üzerinde değişiklik yapmayacaksan const kullanmalısın.

Kod: Tümünü seç

function Topla(const x, y : Integer) : integer;
begin
   result := x+y;
end;
gibi. Bu durumda hafızadan yer ayrılmadan değerler kullanılır fakat x, y değerleri fonksiyon içerisinden değiştirilemez.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Glen
Üye
Mesajlar: 277
Kayıt: 12 Eki 2005 11:58

Mesaj gönderen Glen »

O zaman 4 bytetan daha fazla yer kaplayan degiskenler icin + const disindaki ifadeler icin pointer kullanmamiz daha saglikli olur.. ?

Tesekkurler..
Kullanıcı avatarı
undefined
Moderator
Mesajlar: 565
Kayıt: 06 Eki 2003 12:01
Konum: Bursa
İletişim:

Mesaj gönderen undefined »

integer'da 32 bit, pointerda 32 bit ne kazandın :)
Function parametreleri stack üzerinden geçer.
Daha büyük bir değer geçirsen bile, (delphi için konuşursam) stack üzerinde tasarruf yapılması akıllıca değil. Çünkü stack, durmadan yeni verilern eskileri üzerine yazılan bir yer, burası kolay kolay dolmaz. Bunun yeri zaten baştan rezerve edilir.

Parametre olarak geçebilecek değişik veritürlerini inceleyelim.

Primitive tipler : stackten direk geçerler. Primitive tiplerde zaten oldukça ufaklar.

Object'ler : Delphide objectler stack'te duramaz. Her zaman heaptedirler. Biz onlara referans değerlerle ulaşırız, bu referans değerler sadece pointerdır yani 32bit. C++ 'ta ise durum farklıdır, onlara genelde stackte yaratılırlar, eğer referans tipi denen özel c++ tipi ile parametreden geçirmessen boylu boyunca stackten geçerler.

Stringler : Stringlerde parametreden referansla geçer, fakat short stringler boylu boyunca stackten geçiyor bildiğim kadarıyla.

Recordlar : İşte bunlara dikkat et, bunlar boylu boyunca stack kullanıyor olabilir. Kesin bilgim yok.

Dinamik array : Referansla

Statik arraylar : Recordlarla aynı.

Integer gibi ilkel tipler ve referansla geçen değerler için memory tasarrufu düşünmen gerekmez. Gerekseydi bile, eğer yazılımın çok kritik bir uygulama değilse, 3-5 byte'ın hesabını yapıp kodun okunaklığının içine etmeye değmez.
Diğer tiplere dikkat edebilirsin.
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

Bu şekilde kullanımın da pek mantığını kuramadım. Çünkü değeri değiştirilecekse o zaman da const yerine var kullanmalısın. Bu da tıpkı const gibi değişken için hafıza işgali yapmaz fakat değişken değeri fonksiyon içinden değiştirilebilir. Pointer kullanarakta değer değiştirilirse yine var kullanılmış gibi dışarıdaki değişken değeri değişir. Üstelik fazladan hafızada 4 byte işgali de cabası. Pointerları bu tür basit veri akışında kullanmak pek mantıklı değil. Göstericilerle özel işin olursa ancak o zaman kullanmalısın.

Kod: Tümünü seç

function Topla(var x, y : Integer) : integer;
begin
   result := x+y;
   x:=5;
end;
ile

Kod: Tümünü seç

function Topla(const x, y : PInteger) : integer;
begin
   result := x^+y^;
  x^:=5;
end;
aynı işlevdedirler. Ayrıca parametre ile alınan değerin geldiği yerde değişiklik olmayacak fakat parametre değişkeninde değişiklik yapılacaksa o zaman sade kullanım esastır.

Kod: Tümünü seç

function Topla(x, y : Integer) : integer;
begin
   x := x+y;
  result := x;
end;
Bu şekilde kullanımda fonksiyon çağrıldığı yerde bulunan değişkenin değerine bulaşmaz. Çünkü bu değişkenler hafızada bağımsız olarak oluşturulmuşlardır. Asıl mesel fonksiyon içi kullanımdır. var const veya bunların dışında sade olarak yazılan tanımlar tüm basit tipte tanımlanan değişkenlerin tüm ihtiyaçlarını karşılamaktadır. Göstericiler daha çok bir dizi bilgi (özellikle dinamik boyutta ve yapıda olan bilgilerin) erişiminde kullanılmaktadır.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
undefined
Moderator
Mesajlar: 565
Kayıt: 06 Eki 2003 12:01
Konum: Bursa
İletişim:

Mesaj gönderen undefined »

Glen yazdı:O zaman 4 bytetan daha fazla yer kaplayan degiskenler icin + const disindaki ifadeler icin pointer kullanmamiz daha saglikli olur.. ?

Tesekkurler..
Evet, parametrede Var veya Const tanımlarsan herzaman referans geçirtir buda pointerla aynı işlemi gördürtür zaten. Ama neyin nasıl geçtiğinede aşina olursan referans tipleri pointerlamaya çabalamak gibi şeylere kalkışmamanı sağlarki ben ilk yıllarımda yapmadım değil :)
Glen
Üye
Mesajlar: 277
Kayıt: 12 Eki 2005 11:58

Mesaj gönderen Glen »

Ben parametrelerin basinda var veya const kullanmiyorum(dum)..

Direk x, y : VeriTipi seklinde tanimliyordum o yuzden tanimlanan x ve y hafizada ekstra yer kapladigi icin pointer tanimlasam mi die sordum..

Yukaridaki verdigim ornege takilmayalim integera yani:) maksadim olayi anlatmakti.. nitekim cevap burada constveya var kullanmakmi$ ;)

Tesekkur ederim..
Cevapla