Konuyu Oyla:
  • Derecelendirme: 5/5 - 2 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Variant To TBytes
#28
(14-08-2017, Saat: 09:25)esistem Adlı Kullanıcıdan Alıntı:
(11-08-2017, Saat: 17:13)ismailkocacan Adlı Kullanıcıdan Alıntı: 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.
String Types Delphi 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 kaynak.
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 UnicodeString type has exactly the same structure as the AnsiString type. 
WWW
Cevapla


Bu Konudaki Yorumlar
Variant To TBytes - Yazar: Tuğrul HELVACI - 09-08-2017, Saat: 11:54
Variant To TBytes - Yazar: Abdullah ILGAZ - 09-08-2017, Saat: 12:13
Cvp: Variant To TBytes - Yazar: Tuğrul HELVACI - 09-08-2017, Saat: 12:47
Cvp: Variant To TBytes - Yazar: Abdullah ILGAZ - 10-08-2017, Saat: 10:49
Cvp: Variant To TBytes - Yazar: YBSUzmani - 09-08-2017, Saat: 13:13
Cvp: Variant To TBytes - Yazar: esistem - 09-08-2017, Saat: 13:26
Cvp: Variant To TBytes - Yazar: Tuğrul HELVACI - 09-08-2017, Saat: 14:11
Variant To TBytes - Yazar: compute - 09-08-2017, Saat: 15:56
Cvp: Variant To TBytes - Yazar: Tuğrul HELVACI - 09-08-2017, Saat: 16:57
Variant To TBytes - Yazar: compute - 09-08-2017, Saat: 17:55
Variant To TBytes - Yazar: SimaWB - 09-08-2017, Saat: 23:11
Cvp: Variant To TBytes - Yazar: compute - 10-08-2017, Saat: 11:06
Variant To TBytes - Yazar: uparlayan - 10-08-2017, Saat: 14:07
Variant To TBytes - Yazar: vkamadan - 10-08-2017, Saat: 15:56
Cvp: Variant To TBytes - Yazar: Tuğrul HELVACI - 10-08-2017, Saat: 16:06
Cvp: Variant To TBytes - Yazar: uparlayan - 10-08-2017, Saat: 19:19
Variant To TBytes - Yazar: compute - 10-08-2017, Saat: 17:29
Variant To TBytes - Yazar: esistem - 11-08-2017, Saat: 09:19
Cvp: Variant To TBytes - Yazar: uparlayan - 11-08-2017, Saat: 09:33
Cvp: Variant To TBytes - Yazar: Tuğrul HELVACI - 11-08-2017, Saat: 10:00
Cvp: Variant To TBytes - Yazar: ismailkocacan - 11-08-2017, Saat: 17:13
Variant To TBytes - Yazar: esistem - 11-08-2017, Saat: 09:35
Variant To TBytes - Yazar: SimaWB - 11-08-2017, Saat: 09:47
Variant To TBytes - Yazar: esistem - 11-08-2017, Saat: 10:14
Variant To TBytes - Yazar: esistem - 14-08-2017, Saat: 09:25
Cvp: Variant To TBytes - Yazar: Tuğrul HELVACI - 14-08-2017, Saat: 10:58
Cvp: Variant To TBytes - Yazar: ismailkocacan - 15-08-2017, Saat: 02:27
Variant To TBytes - Yazar: SimaWB - 14-08-2017, Saat: 11:13
Variant To TBytes - Yazar: esistem - 15-08-2017, Saat: 12:52
Cvp: Variant To TBytes - Yazar: ismailkocacan - 15-08-2017, Saat: 13:25



Konuyu Okuyanlar: 2 Ziyaretçi