Konuyu Oyla:
  • Derecelendirme: 5/5 - 2 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Variant To TBytes
#21
SizeOf(string) ile string'in uzunluğunu almaya çalışmak SizeOf'un suçu değil Big Grin
O yüzden SizeOf "bazen" yanlış sonuç vermez. Sadece bazen yanlış kullanılmış olabilir.
There's no place like 127.0.0.1
WWW
Cevapla
#22
(11-08-2017, Saat: 09:19)esistem Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
(10-08-2017, Saat: 19:19)uparlayan Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.SizeOf, bir değişkenin veya type'in bayt cinsinden depolama boyutunu verir.
procedure TForm1.Button1Click(Sender: TObject);
var
 S: String;
begin
 S := 'ali veli';
 Memo1.Clear;
 memo1.Lines.Add(SizeOf(S).ToString); // 4
 memo1.Lines.Add(Length(S).ToString); // 8
end;

Bu olayı anlamadım, S değişkenini bellekte nasıl 4 byte alana sığdırırz ?

Çünkü String'ler referans sayımlı pointer'lardır üstadım.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#23
Doğru hocam da benim kafa kapladığı alana gidince 8 karakter nasıl 4 byte alana sığar yahu diye afalladım bi an.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
WWW
Cevapla
#24
(11-08-2017, Saat: 09:19)esistem Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
(10-08-2017, Saat: 19:19)uparlayan Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.SizeOf, bir değişkenin veya type'in bayt cinsinden depolama boyutunu verir.
procedure TForm1.Button1Click(Sender: TObject);
var
 S: String;
begin
 S := 'ali veli';
 Memo1.Clear;
 memo1.Lines.Add(SizeOf(S).ToString); // 4
 memo1.Lines.Add(Length(S).ToString); // 8
end;

Bu olayı anlamadım, S değişkenini bellekte nasıl 4 byte alana sığdırırz ?

Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
Alıntı:When the variable is nonempty, it points to a dynamically allocated block of memory that contains the string value. This memory is allocated on the heap, but its management is entirely automatic and requires no user code.

String ve dinamik array'lerin veri bloğu hafızanın heap(dynamic memory) diye isimlendirilen bölgesinde tahsis edilir.
SizeOf(S) ile heap'deki veri bloğuna işaret eden adresin kapladığı alanı bulmuş olursunuz.

32 bit bir uygulamada Pointer bir değişkenin kapladığı alan 4 byte iken, 64 bit bir uygulamada Pointer değişkenin kapladığı alan 8 byte'dır.
Dolayısı ile SizeOf(S) 32 bit bir uygulamada 4 sonucunu döndürüyorken, 64 bit bir uygulamada 8 değerini döndürecektir.
WWW
Cevapla
#25
(11-08-2017, Saat: 17:13)ismailkocacan Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.String ve dinamik array'lerin veri bloğu hafızanın heap(dynamic memory) diye isimlendirilen bölgesinde tahsis edilir.
SizeOf(S) ile heap'deki veri bloğuna işaret eden adresin kapladığı alanı bulmuş olursunuz.
32 bit bir uygulamada Pointer bir değişkenin kapladığı alan 4 byte iken, 64 bit bir uygulamada Pointer değişkenin kapladığı alan 8 byte'dır.
Dolayısı ile SizeOf(S) 32 bit bir uygulamada 4 sonucunu döndürüyorken, 64 bit bir uygulamada 8 değerini döndürecektir.
Buraya kadar olan kısım tamamdır hocam. Peki bu 4 btye alanda string bir değişkenin başladığı ve bittiği adreslerimi tutuyor? Misal SmallInt 2 byte uzunluğudan işaretli tam sayı tipidir. Hesaplarken bayt1*bayt2 kullanılır dolayısı ile 128*256=32768 max değere ulaşır. Integer da 4 byte alandır oda, bayt1*bayt2*bayt3*bayt4 yani 128*256*256*256=2.147.483.648 max değere ulaşır (+ ve- olayında dolayı 128 ile çarpılıyor). Burada benmi farklı düşünüyorum bilmiyorum. Siz işaretlediği alandaki değeri pointerden otomatik çektiriyorsunuz. Zamanında veritabanı yapıları ile uğraşırken bu integer, byte, currency değerleri vt de nasıl tutuyor diye araştırıp bunları bulmuştum. Mesela string 4 byte ile işaret ediliyor. bunun hangi bayt ında ne saklanıyorda bu alet gidip değeri okuyup getiriyor bize ? Başlangıç adresi şurası boyutuda bu mu deniyor mesela? yada başlangıç ve bitiş adresleri şunlar arada bu kadar da veri saklanıyormu deniyor?

Soru biraz karmaşık oldu sanırım kusura bakmayın.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
WWW
Cevapla
#26
(14-08-2017, Saat: 09:25)esistem Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
(11-08-2017, Saat: 17:13)ismailkocacan Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.String ve dinamik array'lerin veri bloğu hafızanın heap(dynamic memory) diye isimlendirilen bölgesinde tahsis edilir.
SizeOf(S) ile heap'deki veri bloğuna işaret eden adresin kapladığı alanı bulmuş olursunuz.
32 bit bir uygulamada Pointer bir değişkenin kapladığı alan 4 byte iken, 64 bit bir uygulamada Pointer değişkenin kapladığı alan 8 byte'dır.
Dolayısı ile SizeOf(S) 32 bit bir uygulamada 4 sonucunu döndürüyorken, 64 bit bir uygulamada 8 değerini döndürecektir.
Buraya kadar olan kısım tamamdır hocam. Peki bu 4 btye alanda string bir değişkenin başladığı ve bittiği adreslerimi tutuyor? Misal SmallInt 2 byte uzunluğudan işaretli tam sayı tipidir. Hesaplarken bayt1*bayt2 kullanılır dolayısı ile 128*256=32768 max değere ulaşır. Integer da 4 byte alandır oda, bayt1*bayt2*bayt3*bayt4 yani 128*256*256*256=2.147.483.648 max değere ulaşır (+ ve- olayında dolayı 128 ile çarpılıyor). Burada benmi farklı düşünüyorum bilmiyorum. Siz işaretlediği alandaki değeri pointerden otomatik çektiriyorsunuz. Zamanında veritabanı yapıları ile uğraşırken bu integer, byte, currency değerleri vt de nasıl tutuyor diye araştırıp bunları bulmuştum. Mesela string 4 byte ile işaret ediliyor. bunun hangi bayt ında ne saklanıyorda bu alet gidip değeri okuyup getiriyor bize ? Başlangıç adresi şurası boyutuda bu mu deniyor mesela? yada başlangıç ve bitiş adresleri şunlar arada bu kadar da veri saklanıyormu deniyor?

Soru biraz karmaşık oldu sanırım kusura bakmayın.

Üstadım, sizi şu Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.'e alalım ;-)
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#27
(14-08-2017, Saat: 09:25)esistem Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Mesela string 4 byte ile işaret ediliyor. bunun hangi bayt ında ne saklanıyorda bu alet gidip değeri okuyup getiriyor bize ? Başlangıç adresi şurası boyutuda bu mu deniyor mesela? yada başlangıç ve bitiş adresleri şunlar arada bu kadar da veri saklanıyormu deniyor?

C veya birçok dil kullansanız başlangıç pointer'ında sonra string sonunu (#0) buluncaya kadar ilerlemeniz gerekirdi. Ama Delphi bize burada da kolaylık sağlıyor. Bizim için string'in uzunluğunu bir yerde saklıyor.
Bundan sonrası merak edenlerin araştırmasına kalsın Wink
There's no place like 127.0.0.1
WWW
Cevapla
#28
(14-08-2017, Saat: 09:25)esistem Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
(11-08-2017, Saat: 17:13)ismailkocacan Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.String ve dinamik array'lerin veri bloğu hafızanın heap(dynamic memory) diye isimlendirilen bölgesinde tahsis edilir.
SizeOf(S) ile heap'deki veri bloğuna işaret eden adresin kapladığı alanı bulmuş olursunuz.
32 bit bir uygulamada Pointer bir değişkenin kapladığı alan 4 byte iken, 64 bit bir uygulamada Pointer değişkenin kapladığı alan 8 byte'dır.
Dolayısı ile SizeOf(S) 32 bit bir uygulamada 4 sonucunu döndürüyorken, 64 bit bir uygulamada 8 değerini döndürecektir.
Buraya kadar olan kısım tamamdır hocam. Peki bu 4 btye alanda string bir değişkenin başladığı ve bittiği adreslerimi tutuyor? Misal SmallInt 2 byte uzunluğudan işaretli tam sayı tipidir. Hesaplarken bayt1*bayt2 kullanılır dolayısı ile 128*256=32768 max değere ulaşır. Integer da 4 byte alandır oda, bayt1*bayt2*bayt3*bayt4 yani 128*256*256*256=2.147.483.648 max değere ulaşır (+ ve- olayında dolayı 128 ile çarpılıyor). Burada benmi farklı düşünüyorum bilmiyorum. Siz işaretlediği alandaki değeri pointerden otomatik çektiriyorsunuz. Zamanında veritabanı yapıları ile uğraşırken bu integer, byte, currency değerleri vt de nasıl tutuyor diye araştırıp bunları bulmuştum. Mesela string 4 byte ile işaret ediliyor. bunun hangi bayt ında ne saklanıyorda bu alet gidip değeri okuyup getiriyor bize ? Başlangıç adresi şurası boyutuda bu mu deniyor mesela? yada başlangıç ve bitiş adresleri şunlar arada bu kadar da veri saklanıyormu deniyor?

Soru biraz karmaşık oldu sanırım kusura bakmayın.

Şimdi şöyle oluyor hocam.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız. dokümanında görüleceği üzere farklı türde string tipleri ve bu tiplerin nasıl bir yapıya ve nasıl çalıştıklarına dair bilgiler var.
Alıntı:An AnsiString variable is a structure containing string information. When the variable is empty - that is, when it contains a zero-length string, the pointer is nil and the string uses no additional storage. When the variable is nonempty, it points to a dynamically allocated block of memory that contains the string value. This memory is allocated on the heap, but its management is entirely automatic and requires no user code. The AnsiString structure contains a 32-bit length indicator, a 32-bit reference count, a 16-bit data length indicating the number of bytes per character, and a 16-bit code page.

Bu açıklamada AnsiString tipinin iç yapısının aslında bir structure/record ile implement edildiğini ve bu structure/record içinde indicator, reference count, length gibi alanların olduğu söylüyor.Yani biz string bir değişken tanımladığımızda hafızada daha başka alanlarda tahsis ediliyor.

Bunun dışında AnsiString tipinin implementasyonunu açıklayan başka bir Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız..
Alıntı:Description

The AnsiString type is a long, reference-counted string containing AnsiChar characters. By default, Delphi treats the generic string type as synonymous with AnsiString. If you use the $H- or $LongStrings compiler directives, though, string becomes the same as ShortString.
Delphi stores an AnsiString as a pointer to a record, but instead of pointing to the start of the record, the AnsiString pointer points to the start of the Data member. The Length and RefCount members precede the string contents.
type
 // This is the logical structure of an AnsiString, but the
 // declaration below is descriptive and cannot be compiled.
 TAnsiString = record
   RefCount: LongWord;
   Length: LongWord;
   Data: array[1..Length+1] of AnsiChar;
 end;

Kalın ile işaretlediğim kısım sorunuza yanıt olabilecek niteliktedir.
Delphi AnsiString tipini hafızada tahsis ederken, bir record'a işaret edecek şekilde tahsis eder.Fakat bu adres record'un başlangıç adresini işaret etmek yerine record'un içinde bulunan Data alanında ki verinin adresini işaret eder diyor.

Yani aslında AnsiString bir değişken tanımladığımızda compiler bir ilüzyon yapıp, arkaplanda bir TAnsiString'e benzer bir record tahsis ediyor.Bu record içersinde de string'in uzunluğunu, referans sayısını vs tutuyor.

Çok detaylı incelemedim ama belkide delphinin standart Length fonksiyonu gidip bu yapı üzerinden string'in uzunluğunu okuyor olabilir.

Elimizde bu yapı olmasa bile biz yapının tipini biliyorsak pointer aritmetiği ile bu değerlere erişebiliriz.
Pratikte bir örnek vermek gerekirse;
var
 S: AnsiString;
 RefCount: LongInt;
 StrLength: LongInt;

begin
 S := 'Uykum geldi';
 StrLength := PLongInt(PByte(S) - 4)^; // Length
 RefCount := PLongInt(PByte(S) - 8)^; // RefCount
end.

Her ne kadar AnsiString tipi üzerinden konuşsak da benzer yapı UnicodeString tipinde de aynı imiş.
Alıntı:The Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız. type has exactly the same structure as the Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız. type. 
WWW
Cevapla
#29
Eyvallah hocam, açıklama için teşekkürler.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
WWW
Cevapla
#30
(15-08-2017, Saat: 12:52)esistem Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Eyvallah hocam, açıklama için teşekkürler.

Rica ederim, açık konuşmam gerekirse, siz sorana kadar anlattığım şekilde bende o kadar detaylı bilmiyordum.
Daha öncede Delphi in a Nutshell kitabını önermiştim.Orada çok detaylı ve güzel şeyler yazıyor.
O kaynaktan okuyup anladıklarını paylaşan arkadaşlar olursa severek okuruz. :ss
WWW
Cevapla




Konuyu Okuyanlar: 1 Ziyaretçi