OOP ile ilgili yardım - sayfa 2

 
Ihor Herasko # :
Renat'ta aniden tartışmak istersen, hoşgeldin .

ee, şöyle:

Ihor Herasko # :

Ve bir an. Bir işaretçi aracılığıyla nesne dizileri oluşturmak daha iyidir. Aksi takdirde, yığın belleğinde çok küçük bir dizi elde edersiniz:

Renat'ın söyledikleriyle ve yukarıdaki örneklerle hiçbir ilgisi yoktur.
 
Ihor Herasko # :

Yerel düzeyde bir bildirimde bulunarak ve o kadar da korkunç olmayan bir sayı koyarak örneği biraz değiştirirseniz, derleyici sorunun tam olarak ne olduğunu zaten düz metin olarak yazar:

Renat'ta aniden tartışmak istersen, hoşgeldin .

Kendi örneğinde:

Test *pClassTest[];

fonksiyonun dışında global bir değişken olarak tanımlanır. Peki buradaki yığın nedir? Bu bir yığın.

 
Vasiliy Sokolov # :

Kendi örneğinde:

fonksiyonun dışında global bir değişken olarak tanımlanır. Peki buradaki yığın nedir? Bu bir yığın.

Mükemmel! Vasily, tartışmaya girdin, ne hakkında tartıştığını anlamadın ve anlaşmazlığın ne hakkında olduğunu anlamak için çaba sarf etmedin mi?

Igor, yığında gerekli olduğunu iddia ediyor ve bu kod satırı, birinciden farklı olarak derlenen (ve içinde işaretçi olmayan) ikinci ("doğru") örnekten geliyor.

 
Ihor Herasko # :

Yerel düzeyde bir bildirimde bulunarak ve o kadar da korkunç olmayan bir sayı koyarak örneği biraz değiştirirseniz, derleyici sorunun tam olarak ne olduğunu zaten düz metin olarak yazar:

Renat'ta aniden tartışmak istersen, hoşgeldin .

"Korkunç değil" hesabına. Nasıl denir. Varsayılan yığın 1 MB'dir ve bunun üzerine ARRAY_SIZE*sizeof(Test) ayırırsınız, bu açıkça daha büyüktür

 
Ihor Herasko # :

Bu bir sorun değil, çok daha az potansiyel bir sorun. Sadece MT'de bellekle çalışmanın özellikleri. İşte statik dizi:

Ve işte dinamik dizi:

Bu durumda, her şey derlenir ve çalışır.

Devam et.

İlk durumda, bellek derleme zamanında tahsis edilir. Yani, programın .data segmenti bu ARRAY_SIZE*sizeof(Test)'i içermelidir. Ne kadar ARRAY_SIZE vardı?))) Yanılmıyorsam 2TB .ex5 altında dosya çıkıyor))))

İkinci durumda, ARRAY_SIZE*sizeof(Test*) baytları yığında tahsis ediliyor, yani. 480GB,

 

çift x[268435448]; genel bölümünde derlenmiştir.

268435449 - artık derlenmiyor

Ve OnStart() 'ta 268435449 betiği derlenir ve bu büyük x dizisini genel bölümde bırakır.

268435448*8= 2147483584 iki konserdir.

***

Ve işte fonksiyondaki limit: double x[268435456];

 

Yığın hakkında sağa bakın:

Bir MQL5 programı için yığın boyutunu belirtir; özyinelemeli işlev çağrıları durumunda yeterli yığın gerekir.

Bir komut dosyası veya Uzman Danışman başlatıldığında, grafikte en az 8 Mb'lık bir yığın tahsis edilir, özellik göstergeler için çalışmaz - yığın her zaman sabit bir 1Mb boyutundadır.

Test cihazında başlatıldığında, programa her zaman 16 MB'lık bir yığın tahsis edilir.


Muhtemelen, yığın yalnızca özyinelemeli işlev çağrıları için kullanılır. Bu nedenle, statik dizilerin boyutu ne olursa olsun, özyinelemeli bir çağrı için yığın olduğu gibi kalacaktır.

 
Dmitry Fedoseev # :

Mükemmel! Vasily, tartıştığınız şeyi anlamadan ve anlaşmazlığın ne hakkında olduğunu anlamak için çaba sarf etmeden anlaşmazlığa girdiniz mi?

Igor, yığında gerekli olduğunu iddia ediyor ve bu kod satırı, birinciden farklı olarak derlenen (ve içinde işaretçi olmayan) ikinci ("doğru") örnekten geliyor.

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

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

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

OOP ile ilgili yardım

İhor Herasko , 2021.09.19 21:00

Ve bir an. Bir işaretçi aracılığıyla nesne dizileri oluşturmak daha iyidir. Aksi takdirde, yığın belleğinde çok küçük bir dizi elde edersiniz:

Strategy2 *pZ[]; 

Bu yanlış bir ifadedir. Yığındaki diziler tahsis edilmez . Ne işaretçiler aracılığıyla ne de statik olarak. Bunu kontrol etmek kolaydır.

İkinci nokta: örnek, işaretçiler kullanır, ancak orada gerekli değildir. Baller plakası olmayan eşdeğer bir örnek:

 #define               ARRAY_SIZE           int ( 60000000 )
class Test
{
public :
   int                nA;
   double             fB;
   datetime           dtC;

                     Test( void )
                       : nA( 0 )
                       , fB( 1.0 )
                       , dtC( __DATETIME__ )
                     {
                     };
};

Test pClassTest[];
 
void OnStart ()
{
   if ( ArrayResize (pClassTest, ARRAY_SIZE) != ARRAY_SIZE)
   {
       Alert ( "Not enought memory" );
       return ;
   }
}

Aynı 60.000.000 nesne, bir varsayılan kurucu çağrısı ile tahsis edilir. Aynı zamanda, belleği manuel olarak başlatmaya ve sonra serbest bırakmaya gerek yoktur, bu da önemli ölçüde (bazen) zaman kazandırır ve kodu çok daha güvenli ve basit hale getirir.

Kontrol ediyoruz. Bir ara veriyoruz ve süreç yöneticisinde açıyoruz. İşte ProcessHacker'da:

Özel alanda sırasıyla 4 ve 2 GB ayrılmıştır.

Yığın boyutlarını kontrol etme:


Komut dosyası yığını 8 MB'dir ve bu maksimum yığındır.

Kafanızdaki mantığı açıp, her biri 20 baytlık 60.000.000 nesnenin 1 GB'den fazla bellek kaplayacağını hesaplamak kolaydır. Tek bir yığın onu içermek için yeterli değil.

Bu durumda, her iki örnek de (işaretçili ve işaretçisiz) aynı profili verir. Yığın üzerinde hiçbir şey tahsis edilmez. Ancak, işaretçili örnek 1 GB daha fazla bellek ayırır, bunun doğrulanması da kolaydır.

ps Programın yürütülmesi sırasında maksimum yığın boyutunu alıp değiştiremezsiniz. Maksimum yığın boyutu önceden belirlenir ve örneğin derleme sırasında önceden ayarlanır.

z.s.s. Tamamen teorik olarak, yığında küçük statik diziler tahsis etmek mümkündür (bu, mql'de açık olmayacaktır). Ancak bu, büyük sorunlara yol açabilir, çünkü kullanıcı, farklı eşlenik işlevlerde bile bu tür birkaç diziyi çok kolay bir şekilde oluşturabilir ve böylece yığından taşabilir. Bu nedenle, kullanıcılar böyle bir tatar yayından korunmalı ve boyutları ne olursa olsun dizileri her zaman paylaşılan bellekte tahsis etmelidir.

 
Dmitry Fedoseev # :

çift x[268435448]; genel bölümünde derlenmiştir.

268435449 - artık derlenmiyor

Ve OnStart() 'ta 268435449 betiği derlenir ve bu büyük x dizisini genel bölümde bırakır.

268435448*8= 2147483584 iki konserdir.

***

Ve işte fonksiyondaki limit: double x[268435456];

Bunlar kod çözümleyicisinin sınırlamalarıdır. Sonuçta mql'de varsa ne 4, ne 6 ne de 20 GB bellek ayırmada aslında bir sorun yok.

 
Vasiliy Sokolov # :

dizileri boyutlarına bakılmaksızın her zaman paylaşılan bellekte tahsis edin.

Statik diziler kullanmıyor musunuz?