Değişkenleri bir döngünün arkasında mı yoksa bir döngünün içinde mi bildiriyorsunuz?

 
   string st = "" ;
   for ( int i = 0 ; i < 1000 ; i++)
   {
      st = i;
      ...
   }

veya

   for ( int i = 0 ; i < 1000 ; i++)
   {
       string st = i;
      ...
   }

Bir fark var mı? tüm mql5 derleyici optimizasyonlarını hesaba katarak mı?

 
pivalexander :

veya

Bir fark var mı? tüm mql5 derleyici optimizasyonlarını hesaba katarak mı?

Derlemede hiçbir fark yoktur, bu nedenle ikinci seçeneği kullanmaktan çekinmeyin.
 

Şahsen ben ilkini tercih ederim.

Her ihtimale karşı. Derleyici her seferinde bellek ayırmayacak kadar akıllı olabilir, ancak ilk durumda bunu açıkça belirtiyorum, ancak ikinci durumda bu, dilin mantığına göre, derleyicinin çalışmasının örtük bir sonucudur, çünkü, değişken blok içinde oluşturulmalı ve bloktan çıkarken kaldırılmalıdır.

Eh, int'yi dizgeye dönüştürmeden eşitlemek kötü bir uygulamadır.

 
pivalexander :

Bir fark var mı? tüm mql5 derleyici optimizasyonlarını hesaba katarak mı?

Hiçbir fark olmadığını dinlemeyin. Sadece ilk seçeneği kullanın, bir fark var. Her ne kadar microcl'den disassm çalışmamış olsam da.

 
Georgiy Merts :

Şahsen ben ilkini tercih ederim.

Her ihtimale karşı. Derleyici her seferinde bellek ayırmayacak kadar akıllı olabilir, ancak ilk durumda bunu açıkça belirtiyorum, ancak ikinci durumda bu, dilin mantığına göre, derleyicinin çalışmasının örtük bir sonucudur, çünkü, değişken blok içinde oluşturulmalı ve bloktan çıkarken kaldırılmalıdır.

Eh, int'yi dizgeye dönüştürmeden eşitlemek kötü bir uygulamadır.

George haklı, garanti değil.

Ve 'sayı'dan 'dize' uyarısına örtülü dönüşümü alıyoruz


Ve belirsizlikten ve uyarıdan tam olarak bu şekilde kurtuluruz.

 for ( int i = 0 ; i < 1000 ; i++)
   {
       static string st = IntegerToString (i);
      ...
   }
 
Georgiy Merts :

Şahsen ben ilkini tercih ederim.

Her ihtimale karşı. Derleyici her seferinde bellek ayırmayacak kadar akıllı olabilir, ancak ilk durumda bunu açıkça belirtiyorum, ancak ikinci durumda bu, derleyicinin örtük bir sonucudur.

Benimle dalga mı geçiyorsun? Bu derleyici için o kadar önemsiz bir durum ki burada söylenecek bir şey bile yok. Ve böyle bir paranoya ile, tamamen montajcıda kodlayabilirsiniz) Bu bile şu anda zaten anlamsız hale geliyor. Modern derleyicilerin optimizasyonlarını aşmak için çok denemeniz gerekir.

ps Belki de bu vakadaki önemsizlik konusunda biraz heyecanlandım, çünkü bir dizge tamponundan bahsediyoruz. Ancak MQL'de saklanması garanti edilir. Ve yalnızca döngü içinde değil, işlev çağrıları arasında bile. Bu konu burada defalarca tartışıldı.
 

Dinleme, sana burada söylerler))

 // c++
#include <iostream>
#include < string >
using namespace std;

void * operator new (size_t sz) {
     void *ptr = std::malloc(sz);
     if (ptr)
         return ptr;
     else
         throw std::bad_alloc{};
}


int main() {
         for ( uint i = 0 ;  i < 3 ;  ++ i) {
                 string s;
                 char buf[ 10 ];
                sprintf(buf, "%u" , i);
                s = "sfjhidfsrtea111" ;
                s += buf;
                cout << s << '\n' ;
        }
}

gcc -O3'ü derliyorum, bir hata ayıklayıcı altında çalıştırıyorum, yeni operatöre bir kesme noktası ayarlıyorum, üç çağrı alıyorum. Klan ile aynı.

Not: dize bir döngü için çıkarılırsa, çağrı birdir.

 
Alexey Navoykov :

Benimle dalga mı geçiyorsun? Bu derleyici için o kadar önemsiz bir durum ki burada söylenecek bir şey bile yok. Ve böyle bir paranoya ile, tamamen montajcıda kodlayabilirsiniz) Bu bile şu anda zaten anlamsız hale geliyor. Modern derleyicilerin optimizasyonlarını aşmak için çok denemeniz gerekir.

ps Belki de bu vakadaki önemsizlik konusunda biraz heyecanlandım, çünkü bir dizge tamponundan bahsediyoruz. Ancak MQL'de saklanması garanti edilir. Ve yalnızca döngü içinde değil, işlev çağrıları arasında bile. Bu konu burada defalarca tartışıldı.

Numara. Şaka yapmıyorum.

Tabii ki, bu durumda, normal bir derleyici, döngü içindeki bir değişkenin bildirimini çıkarmalıdır.

Ben sadece "derleyici için umut et, ama kendin hata yapma" diye düşünüyorum. Derleyici standardı, bildirim sırasında yerel bir değişkenin oluşturulduğunu ve bildirildiği blok çıktığında silindiğini varsayar. Bu nedenle, bu ilke ilk etapta yönlendirilmeli ve derleyicinin kodunuzu sizin için geliştirmesini beklememelidir.

Burada, verimlilikten bile değil (aslında modern derleyiciler çok yüksek kaliteli kod sağlar), ancak programcının kendisinin "düşünme şeması" hakkında konuşuyoruz. Codebase'in kaynak kodlarına baktığımda, ne kadar küçük ve basit, ancak potansiyel olarak tehlikeli eksiklikler içerdiklerine genellikle şaşırıyorum. Bu durumda - yine de çok kritik değil, olabilecek maksimum değer - program biraz daha yavaş çalışacaktır. Gerçek hatalar çok daha incedir.

 
Vict :

Dinleme, sana burada söylerler))

gcc -O3'ü derliyorum, bir hata ayıklayıcı altında çalıştırıyorum, yeni operatöre bir kesme noktası ayarlıyorum, üç çağrı alıyorum. Klan ile aynı.

Not: dize bir döngü için çıkarılırsa, çağrı birdir.

Ve başka türlü yapamazdı, çünkü. kesme noktalarınızla optimizasyona kendiniz müdahale ettiniz. Optimizasyonun özü, algoritmanın mantığını değiştirmemesi gerektiğidir. Bu nedenle, onu açık bir şekilde tespit etmek imkansızdır. Bir kesme noktası varsa, doğal olarak derleyicinin bu kodu kesme hakkı yoktur. Derleyicinin bir kesme noktasının üzerinden atlayabileceğini mi varsaydınız? )

Optimizasyon yalnızca derlenmiş kodla veya performans ölçülerek tespit edilebilir. Bu yüzden yapılacak ilk şey bu. Ve sakin ol)

 
Ölçümleri bekliyorum)
 
Alexey Navoykov :

Ve başka türlü yapamazdı, çünkü. kesme noktalarınızla optimizasyona kendiniz müdahale ettiniz. Optimizasyonun özü, algoritmanın mantığını değiştirmemesi gerektiğidir. Bu nedenle, onu açık bir şekilde tespit etmek imkansızdır. Bir kesme noktası varsa, doğal olarak derleyicinin bu kodu kesme hakkı yoktur. Derleyicinin bir kesme noktasının üzerinden atlayabileceğini varsaydınız mı? )

Optimizasyon yalnızca derlenmiş kodla veya performans ölçülerek tespit edilebilir. Bu yüzden yapılacak ilk şey bu. Ve sakin ol)

Kahretsin, bu sadece vahşi yoğunluk, yorumlanacak ne var, hata ayıklayıcının tamamen yanlış anlaşılması.

Hız hakkında - bellek yöneticisi o kadar aptal değil ve işletim sistemine soracağı bir gerçek değil, önceden tahsis edilmiş olanı yeniden kullanabilir. Genel olarak istediğiniz gibi kullanın, size kalmış. Ancak başkalarını buna ikna etmemelisiniz, en azından betonarme kanıtlar sağlanana kadar, neredeler?