Tüm Platformlar için Hızlı Uygulama Geliştirme Kitap Yayın Süreci
Kitap gözden geçirilmek üzere BTG (Bilgi ve Teknoloji Grubu) 'na gönderildi. 05.10.2018-14:10
BTG (Bilgi ve Teknoloji Grubu) tarafından iki sayfalık bir reklam tasarımı bekleniyor. 08.10.2018 - 15:30

Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Record Allocation
#1
Merhaba

Aşağıda bir record tipini heap'de farklı yöntemlerle allocate etmeyi denedim.Şimdilik hata kontrolünü atladım.

program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
 System.SysUtils,
 WinApi.Windows;

type

 TPerson = record
   FirstName: string;
   LastName: string;
   Age: Byte;
 end;

 PPerson = ^TPerson;

var
 Person1: TPerson;
 Person2: PPerson;

 hHeap: Cardinal;

begin
 ReportMemoryLeaksOnShutdown := true;

 WriteLn('Person1 Stack Size :' + SizeOf(Person1).ToString());
 Person1.FirstName := 'kimim';
 Person1.LastName := 'ben';
 Person1.Age := 31;



 New(Person2);
 WriteLn('Person2 Stack Size :' + SizeOf(Person2).ToString());
 Person2^.FirstName := 'kimim';
 Person2^.LastName := 'ben';
 Person2^.Age := 31;
 WriteLn(Person2^.FirstName);
 WriteLn(Person2^.LastName);
 WriteLn(Person2^.Age);
 Dispose(Person2);



 hHeap := GetProcessHeap();
 Person2 := HeapAlloc(hHeap, HEAP_ZERO_MEMORY, SizeOf(TPerson));
 WriteLn('Person2 Stack Size :' + SizeOf(Person2).ToString());
 WriteLn('Person2 Heap Size :' + HeapSize(hHeap, 0, Person2).ToString());
 Person2^.FirstName := 'kimim';
 Person2^.LastName := 'ben';
 Person2^.Age := 31;

 WriteLn(Person2^.FirstName);
 WriteLn(Person2^.LastName);
 WriteLn(Person2^.Age);

 HeapFree(hHeap, 0, Person2);

 Readln;

end.
Çıktı :
Person1 Stack Size :12
Person2 Stack Size :4
kimim
ben
31
Person2 Stack Size :4
Person2 Heap Size :12
kimim
ben
31

Delphi'nin new methodunu mu kullanmak mantıklı, yoksa Windows api fonksiyonlarını mı ?
Avantaj dezanavantları neler olabilir ?
One of the major software engineering challanges is managing change.
Cevapla
#2
(04-03-2017, Saat: 12:52)kimimben Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlMerhaba

Aşağıda bir record tipini heap'de farklı yöntemlerle allocate etmeyi denedim.Şimdilik hata kontrolünü atladım.

program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
 System.SysUtils,
 WinApi.Windows;

type

 TPerson = record
   FirstName: string;
   LastName: string;
   Age: Byte;
 end;

 PPerson = ^TPerson;

var
 Person1: TPerson;
 Person2: PPerson;

 hHeap: Cardinal;

begin
 ReportMemoryLeaksOnShutdown := true;

 WriteLn('Person1 Stack Size :' + SizeOf(Person1).ToString());
 Person1.FirstName := 'kimim';
 Person1.LastName := 'ben';
 Person1.Age := 31;



 New(Person2);
 WriteLn('Person2 Stack Size :' + SizeOf(Person2).ToString());
 Person2^.FirstName := 'kimim';
 Person2^.LastName := 'ben';
 Person2^.Age := 31;
 WriteLn(Person2^.FirstName);
 WriteLn(Person2^.LastName);
 WriteLn(Person2^.Age);
 Dispose(Person2);



 hHeap := GetProcessHeap();
 Person2 := HeapAlloc(hHeap, HEAP_ZERO_MEMORY, SizeOf(TPerson));
 WriteLn('Person2 Stack Size :' + SizeOf(Person2).ToString());
 WriteLn('Person2 Heap Size :' + HeapSize(hHeap, 0, Person2).ToString());
 Person2^.FirstName := 'kimim';
 Person2^.LastName := 'ben';
 Person2^.Age := 31;

 WriteLn(Person2^.FirstName);
 WriteLn(Person2^.LastName);
 WriteLn(Person2^.Age);

 HeapFree(hHeap, 0, Person2);

 Readln;

end.
Çıktı :
Person1 Stack Size :12
Person2 Stack Size :4
kimim
ben
31
Person2 Stack Size :4
Person2 Heap Size :12
kimim
ben
31

Delphi'nin new methodunu mu kullanmak mantıklı, yoksa Windows api fonksiyonlarını mı ?
Avantaj dezanavantları neler olabilir ?

Çok büyük bir avantajı dezavanjayı olduğunu söyleyemeyiz. Ancak New kullanırsanız; tahsis edilen bellek bölgesi; tahsisattan sonra düzgün bir şekilde initialize edilir. Böylece çöp data ile karşılaşmamış olursunuz. Ancak API kullanarak da elbette bunu yapabilirsiniz. Bu iş için Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol, Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol, Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol, Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol, Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol vs. kullanılabilir.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#3
var
 Persons: TArray<TPerson>;
begin
 SetLength(Persons, 1);
 Persons[0].FirstName := 'Kimim';  
 Persons[0].LastName := 'Ben';
 Persons[0].Age := 31;
 Persons := nil;

Şeklinde daha kısa ve basit şekilde yazmak da mümkün değil mi ?

E.O.F.  (End Of Fun )
Rolleyes
Cevapla
#4
(07-03-2017, Saat: 12:22)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
(04-03-2017, Saat: 12:52)kimimben Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlMerhaba

Aşağıda bir record tipini heap'de farklı yöntemlerle allocate etmeyi denedim.Şimdilik hata kontrolünü atladım.

program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
 System.SysUtils,
 WinApi.Windows;

type

 TPerson = record
   FirstName: string;
   LastName: string;
   Age: Byte;
 end;

 PPerson = ^TPerson;

var
 Person1: TPerson;
 Person2: PPerson;

 hHeap: Cardinal;

begin
 ReportMemoryLeaksOnShutdown := true;

 WriteLn('Person1 Stack Size :' + SizeOf(Person1).ToString());
 Person1.FirstName := 'kimim';
 Person1.LastName := 'ben';
 Person1.Age := 31;



 New(Person2);
 WriteLn('Person2 Stack Size :' + SizeOf(Person2).ToString());
 Person2^.FirstName := 'kimim';
 Person2^.LastName := 'ben';
 Person2^.Age := 31;
 WriteLn(Person2^.FirstName);
 WriteLn(Person2^.LastName);
 WriteLn(Person2^.Age);
 Dispose(Person2);



 hHeap := GetProcessHeap();
 Person2 := HeapAlloc(hHeap, HEAP_ZERO_MEMORY, SizeOf(TPerson));
 WriteLn('Person2 Stack Size :' + SizeOf(Person2).ToString());
 WriteLn('Person2 Heap Size :' + HeapSize(hHeap, 0, Person2).ToString());
 Person2^.FirstName := 'kimim';
 Person2^.LastName := 'ben';
 Person2^.Age := 31;

 WriteLn(Person2^.FirstName);
 WriteLn(Person2^.LastName);
 WriteLn(Person2^.Age);

 HeapFree(hHeap, 0, Person2);

 Readln;

end.
Çıktı :
Person1 Stack Size :12
Person2 Stack Size :4
kimim
ben
31
Person2 Stack Size :4
Person2 Heap Size :12
kimim
ben
31

Delphi'nin new methodunu mu kullanmak mantıklı, yoksa Windows api fonksiyonlarını mı ?
Avantaj dezanavantları neler olabilir ?

Çok büyük bir avantajı dezavanjayı olduğunu söyleyemeyiz. Ancak New kullanırsanız; tahsis edilen bellek bölgesi; tahsisattan sonra düzgün bir şekilde initialize edilir. Böylece çöp data ile karşılaşmamış olursunuz. Ancak API kullanarak da elbette bunu yapabilirsiniz. Bu iş için Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol, Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol, Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol, Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol, Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol vs. kullanılabilir.
Programlama dilinin bize sunmuş olduğu içersinde derleyici direktifleri ile wrap edilmiş methodları kullanmak yerine, doğrudan windows api'lerini kullandığımızda işletim sistemine bağımlı bir kod geliştirmiş olmuyor muyuz hocam.
One of the major software engineering challanges is managing change.
Cevapla
#5
Yazdığın her kod zaten işletim sistemine bağımlı bir şekilde çalışır.Programlama dili (üst seviye diller) yazmayı kolaylaştırmak ve programcı hatalarını minimize etmek için basite indirgenmiş bir şekilde fonksiyonlar, prosedürler içerirler.
Ayakkabıyı sefaletten
Çok sonraları tanıdım
Öyle ufuklarda mı olurmuş Allah'ım
Giyer giyer koşardım
Toprağın dostluğundan
Oyuncaklar yaptım çamurdan
Tenimin rengini aldım topraktan
Sen bakma esmerliğim sonradan...





Cevapla
#6
QuadR ilave olarak; çok büyük ihtimalle zaten hangi metodu kullanırsanız kullanın en nihayetinde C kütüphanesinden memcpy, memset vb. alt yordamlara dallanılıyor olacaktır.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#7
(11-03-2017, Saat: 13:18)QuAdR Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlYazdığın her kod zaten işletim sistemine bağımlı bir şekilde çalışır.Programlama dili (üst seviye diller) yazmayı kolaylaştırmak ve programcı hatalarını minimize etmek için basite indirgenmiş bir şekilde fonksiyonlar, prosedürler içerirler.
Aynı fikirdeyim QuadR hocam. İşletim sistemine bağımlı derken eksik ifade etmişim.Aslında Windows işletim sistemine demek istemiştim.
Nitekim HeapAlloc isimli bir allocate etme fonksiyonunu bir başka işletim sistemi sunmuyor olabilir.Dolayısıyla yazdığım kod portable olmaktan çıkıyor.

Delphi'nin yeni Linux derleme desteği ile birlikte kullanılabilecek ortak unit'lerin isimleri aşağıda ki linkte verilmiş.
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
System.Types
System.SysConst
System.TimeSpan
System.Diagnostics
System.SyncObjs
System.VarUtils
System.Rtti
System.TypInfo
System.Math
System.Classes
System.Threading
System.RTLConsts
System.Character
System.Variants
System.SysUtils

Doğrudan Windows.pas içersinde ki Windows API'lerini kullanmak yerine, yukarıda ki listede bulunan sınıf, method vs kullanıldığında, yazdığımız kod hem Linux hem de Windows çalışacaktır.
Belki daha başka platformda da zamanla çalışabiliyor duruma gelecektir.
Elbette yukarıda ki unitler de Windows api fonksiyonlarını derleyici direktifleri doğrultusunda kullanıyor.

Mesela System.Classes unitini hem Windows hemde Linux projesinde kullanabiliyorsak, ve aynı zamanda TThread sınıfı ile thread oluşturmuşsam kodu değiştirmeden her iki platformda da çalışıyor duruma gelecektir.(Denemedim tabi)

constructor TThread.Create(CreateSuspended: Boolean);
{$IFDEF POSIX}
var
 ErrCode: Integer;
{$ENDIF POSIX}
begin
 inherited Create;
 FSuspended := not FExternalThread;
 FCreateSuspended := CreateSuspended and not FExternalThread;
 if not FExternalThread then
 begin
{$IF Defined(MSWINDOWS)}
   FHandle := BeginThread(nil, 0, @ThreadProc, Pointer(Self), CREATE_SUSPENDED, FThreadID);
   if FHandle = 0 then
     raise EThread.CreateResFmt(@SThreadCreateError, [SysErrorMessage(GetLastError)]);
{$ELSEIF Defined(POSIX)}
{$IF Defined(LINUX)}
   sem_init(FCreateSuspendedSem, False, 0);
{$ELSE}
   pthread_mutex_init(FCreateSuspendedMutex, nil);
   pthread_mutex_lock(FCreateSuspendedMutex);
{$ENDIF LINUX OR POSIX}
   ErrCode := BeginThread(nil, @ThreadProc, Pointer(Self), FThreadID);
   if ErrCode <> 0 then
     raise EThread.CreateResFmt(@SThreadCreateError, [SysErrorMessage(ErrCode)]);
{$ENDIF POSIX}
 end else
 begin
{$IFDEF MSWINDOWS}
   FHandle := Winapi.Windows.GetCurrentThread;
{$ENDIF MSWINDOWS}
   FThreadId := GetCurrentThreadId;
 end;
end;

Tabi bu yazdıklarım sorduğum soruyla doğrudan alakalı olmasa da, dolaylı yönden ilişkili.
Yanlış mı düşünüyorum.

(13-03-2017, Saat: 12:39)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlQuadR ilave olarak; çok büyük ihtimalle zaten hangi metodu kullanırsanız kullanın en nihayetinde C kütüphanesinden memcpy, memset vb. alt yordamlara dallanılıyor olacaktır.
Tuğrul hocam delphi tarafında henüz çok detaylı debug etme fırsatım olmadı.
Fakat minik bir c++ programcığı yazarak debugger yardımı ile biraz inceledim.

#include <stdio.h>
#include <iostream>

using namespace std;

class MyClass
{
public:
  MyClass();
  ~MyClass();
private:

public:
   string field1;
};

MyClass::MyClass()
{
    printf("kuru pilav cacık");
}

MyClass::~MyClass()
{

}

int main()
{
  printf("before");
  MyClass *c = new MyClass();
  printf("after");
  system("pause");
}
63a66d02c3.png
63a8d5bafb.png
63aa9f3f22.png
63abbe8d3b.png

Burada görüyorum ki; class new operatörü, Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol , Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol, şeklinde bir gidişat mevcut.
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
One of the major software engineering challanges is managing change.
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Record ve Dinamik diziler hakkında yardım esistem 7 343 15-05-2018, Saat: 12:26
Son Yorum: esistem
  Record type içerisindeki değişkenlerime for döngüsü ile erişme yhackup 2 400 24-10-2017, Saat: 16:23
Son Yorum: yhackup



Konuyu Okuyanlar: 1 Ziyaretçi