OOP ile ilgili yardım - sayfa 3

 
Vasiliy Sokolov # :

TAMAM. Anlamıyorum. Anlıyor musun? tam olarak anlıyor musun? Kesinlikle kesinlikle?

Anlaşmazlık aşağıdaki ifadeye kadar kaynar:

...

Genel bir anlaşmazlıkla ilgili değil, bir gönderiyle ilgili bir durumla ilgiliydi ve sorunun ne olduğunu açıkladım. Tamam, kaza olmadı.

 

Bildirilen dizi double x[268435448];

OnStart() işlevindeki aynı dizi.

Ayrıca LONG_MAX derinliğinde özyinelemeli bir arama yaptım.

Sorun yok.

 
fxsaber # :

Statik diziler kullanmıyor musunuz?

büyük. dizinin boyutu küçük, sabit ve önceden biliniyorsa, statik olanlar daha iyi ve muhtemelen daha hızlıdır.

 
Andrei Trukhanovich # :

büyük. dizinin boyutu küçük, sabit ve önceden biliniyorsa, statik olanlar daha iyi ve muhtemelen daha hızlıdır.

Statik değişkenler/diziler ve boyutlarının bir listesini almanın bir yolunu istiyorum. Muhtemelen, burada yapıldığı gibi bir kod analizörüne ihtiyacınız var.

ZY Muhtemelen, statik dizi dizisi ve çift dizi - kesinlikle farklı şeyler.

MQL5 Program Packer
MQL5 Program Packer
  • www.mql5.com
This is MQL5 project packer: assemble all source and resource files from dependencies into a single ZIP.
 
fxsaber # :

ZY Muhtemelen, statik dizi dizisi ve çift dizi - kesinlikle farklı şeyler.

string esasen bir işaretçi ve bir int boyutundan oluşan bir iç sınıftır, yani. çift için dizi şartlı olarak 1,5 kat daha az yer kaplar

Milyonlarca elemanlı statik dizileriniz yoksa, fazla uğraşmanın mantıklı olduğunu düşünmüyorum.

 
fxsaber # :

Statik diziler kullanmıyor musunuz?

MQL'de esasen dört tür veri olduğu ortaya çıktı:

  • Statik, önceden tanımlanmış veriler. Derleme zamanında programa dikilirler ve artık değiştirilmezler. Bazı özel hafıza alanlarında bulunurlar. Örneğin, bunlar char[1024] biçimindeki statik dizileri içerir.
  • İşaretçiler aracılığıyla manuel olarak yönetilen veriler. Bunlar, sınıf örneklerini içerir, ancak CFoo* bar gibi bir işaretçi aracılığıyla tanımlanır; burada bar, CFoo sınıfının bir örneğidir. Bu tür örnekler POINTER_DYNAMIC türünde olacaktır. Çoğu durumda gerekli olmasa da, bu tür depolama en sorunlu olanıdır.
  • Programın çalıştığı mql sanal makinesinin çöp toplayıcısı tarafından yönetilen veriler. Bunlar, sınıf örneklerini içerir. Bu tür bir nesneye işaretçi, POINTER_AUTOMATIC biçiminde olacaktır. Ve bu tür nesnelerin kendileri ya bu sanal makinenin yığınında ya da özel bölümde bulunur. Verilere ne kadar spesifik olarak bağlı, boyutları görünür ve geliştiricilerin buna nasıl sahip olduğu. Bu bilgi mevcut değil. Bu tür veriler, örneğin özel sınıfları içerir. İşaretçi olmayan herhangi bir sınıf örneği tanımı bu depolama türünü tanımlar. Örneğin, CFoo çubuğu, serbest bırakılması gerekmeyen CFoo sınıfının bir bar örneğini tanımlar. Tüm sürüm işlemleri sanal makine tarafından gerçekleştirilir. Silme operatörünü kullanmanıza gerek yoktur ve bu nedenle sızan nesneler sorunuyla karşı karşıya kalırsınız.
  • Yığın üzerinde bulunan veriler. Bunlar, her şeyden önce, fonksiyonların yerel değişkenlerini içerir. Onlar. Bir fonksiyonun içine int a = 5 yazdığımızda, yığının tepesi 4 bayt yukarı hareket eder, böylece gerekli miktarda bellek tahsis edilir. Belki de MQL'de yapılar yığında depolanan türlerdir (dürüst olup olmadığını hiç kontrol etmedim). Bu tür veriler çok az yer kaplar ve iç içe işlev çağrıları zincirinde bile, bir bütün olarak yığın yığından çok daha az bellek gerektirir. Bu tür depolama otomatik olarak kullanılır, bunun hakkında düşünmenize gerek yoktur.

Yığın, işlevlere ve yerel değişkenlerine bırakılırsa, çalışılacak üç tür vardır. Şahsen, otomatik ömrü olan verilerin önceki iki türün avantajlarını iyi bir şekilde birleştirdiğine, ancak dezavantajlarının olmadığına inanıyorum (ve bu sadece benim görüşüm). Otomatik işaretçi ile tanımlanan veriler, statik veriler kadar öngörülebilir ve güvenlidir, ancak manuel olarak kontrol edilen dinamik veriler kadar esnektir. Öngörülebilirlik derken, fazladan yapmanız gerekmeyen senaryoları kastediyorum. bozuk işaretçileri kontrol etmek ve başka birinin bu verileri daha önce silip silmediğini merak etmek. Esneklik derken, normal bir işaretçiyle olduğu gibi otomatik bir işaretçi tarafından başvurulan verilerle çalışabileceğiniz, bu işaretçiyi bir işleve geçirebileceğiniz veya dizilerle ilgili olarak onları yeniden boyutlandırabileceğiniz senaryoları kastediyorum.

Bunu göstermek için, Ihor Herasko tarafından önerilen orijinal kodu ve POINTER_AUTOMATIC formu için verdiğim aynı kodu karşılaştırabilirsiniz. Gereksiz kontroller ve başlatmalar yoktur, 60.000.000 kez silme operatörüne çağrı yapılmaz. Tüm bunlar, somut olmakla birlikte, enerji, zaman ve önemsiz olmayan kaynaklardan tasarruf sağlar. Bunu çözerseniz, işaretçilerle çalışmaya neredeyse hiç gerek yoktur. Böyle bir algoritma yazmak her zaman mümkündür, burada bu iş ya minimuma, hatta sıfıra indirilebilir. Örneğin, kodlarımda nesneleri asla manuel olarak yönetmiyorum, sadece bir şekilde buna gerek yok. Statik dizilere gelince, bazen onları kullanmanız gerekir, örneğin ihtiyaç duyduğu verileri programa dikmek için, ancak bunlar o kadar spesifik şeyler ki, sanırım sıradan kullanıcıların bunlara ihtiyacı yok. CArrayObj türündeki hazır koleksiyonları veya kendi koleksiyonlarınızı kullanmak en iyisidir. Artık şablonlar ve MQL özellikleri, statik dizilerden çok daha iyi olan oldukça esnek şeyler oluşturmanıza olanak tanır.

 
Emkule'de çöp toplayıcı yok.
 

Vasiliy Sokolov # :

Statik, önceden tanımlanmış veriler. Derleme zamanında programa dikilirler ve artık değiştirilmezler. Özel hafızanın belirli bir alanında bulunurlar. Örneğin, bunlar char[1024] biçimindeki statik dizileri içerir.

Dizi başlatılmazsa,

 int A[] = { 1 , 2 }; // Инициализация
int B[ 2 ];         // Без инициализации

Neden EX5'te dikelim?

 
fxsaber # :

Dizi başlatılmazsa,

Neden EX5'te dikelim?

Evet doğru, başlatılmamış olanlar dikilmiyor tabii. Başlatılanlar dikilir. Ancak her iki türün boyutu derleme zamanında belirlenir ve artık değişmez. Onlar. statik diziler koşullu olarak iki gruba ayrılabilir.

 
Dmitry Fedoseev # :
Emkule'de çöp toplayıcı yok.

Resmi olarak evet. Gayri resmi olarak, birçok şey onun hala var olduğunu gösteriyor:

  • MQL'de işaretçiler yoktur. Bunun yerine, onları çok anımsatan bir şey kullanırlar.
  • Örneğin C'deki gibi MQL'de doğrudan bellek tahsisi yoktur;
  • MQL programları belirli bir sanal makine tarafından yürütülür. Renat bunu gelişigüzel ve bir kereden fazla yazdı;
  • Otomatik olarak serbest bırakılacak bir sınıf örneği tanımlayabilirsiniz. Dolayısıyla bu örnekleri takip eden ve gerektiğinde serbest bırakan bir mekanizma var. Çöp toplayıcı değilse nedir?
  • Uygun şekilde serbest bırakılmamış bir işaretçi aracılığıyla başlatılan tüm örnekler, programdan çıktığında sızdırılmış nesneler olarak işaretlenecektir. Bunların sayısı ve toplam boşa harcanan bellek miktarı yazdırılacaktır. Bellek sızıntısı olan bir program, Market'te doğrulamayı bile geçemez. Bu nedenle, tüm nesneler, hatta manuel olarak seçilenler bile dikkate alınır, bilinir ve sistem onları bilir. Bu, çöp toplayıcının çözdüğü klasik görevlerden biridir.