Déclarer les variables derrière la boucle ou à l'intérieur de la boucle ? - page 7

 
Alexey Volchanskiy:

Je viens de rencontrer un groupe de personnes qui pensent que le compilateur se focalise sur les variables locales comme il le fait pour les variables globales.

Et le compilateur ne fait pas de déformation.

C'est le cas, string et print ne sont pas des indicateurs de travail avec des variables.

int a;
int b;

void OnStart()
  {
   b=a+100;
   int c;
   int d=c+5;
   for(int i=0;i<10;i++)
     {
      int e;
      int f=i+e;
     }
  }

tst.mq5' tst.mq5 1 1

utilisation possible d'une variable non initialisée 'c' tst.mq5 16 10

utilisation possible d'une variable non initialisée 'e' tst.mq5 20 17

code généré 1 1

0 erreur(s), 2 avertissement(s), 526 msec écoulés 1 3

 
//c++
 int main() {
        int count= (int)10 e6;
        {
                auto t1 = chrono::high_resolution_clock::now();
                int sum=0;
                for (int i=0; i<count; i++) {
                        string st;
                        st = "12345678qwertyuioasdfgh";
                        sum += st[i%23];
                }
                auto t2 = chrono::high_resolution_clock::now();
                auto duration = chrono::duration_cast<chrono::milliseconds>( t2 - t1 ).count();
                cout << "time = " << duration << endl;
                cout << "sum = " << sum << endl;
        }

  
        {
                auto t1 = chrono::high_resolution_clock::now();
                int sum=0;
                string st = "";
                for (int i=0; i<count; i++) {
                        st = "12345678qwertyuioasdfgh";
                        sum += st[i%23];
                }
                auto t2 = chrono::high_resolution_clock::now();
                auto duration = chrono::duration_cast<chrono::milliseconds>( t2 - t1 ).count();
                cout << "time = " << duration << endl;
                cout << "sum = " << sum << endl;
        }
}

temps = 1018
somme = 894782460
temps = 371
somme = 894782460

Je ne sais pas pourquoi, mais μl dépasse fortement (et les variantes plus complexes de rand()).

Et pour moi, c'est évident - le retirer de la boucle.

 
Alexey Volchanskiy:

Je viens de rencontrer un groupe de personnes qui pensent que le compilateur se focalise sur les variables locales comme il le fait pour les variables globales.

Et le compilateur ne donne aucun mandat.

Ou .... Je ne sais pas. Je l'utilise pour jurer dès que j'en ai l'occasion. .... ))))))

 
Сергей Таболин:

Ou .... Je ne sais pas. Je jure comme ça dès que j'en ai l'occasion .... ))))))

Vous avez une version obscène du compilateur)
 
Vict:

temps = 1018
somme = 894782460
temps = 371
somme = 894782460

Je ne sais pas pourquoi, mais μl a une longueur d'avance sur la courbe (et sur les variantes plus complexes de rand()).

Et pour moi, c'est évident - le retirer de la boucle.

Je ne suis pas un gourou, mais ici, à mon humble avis, déclarer des variables dans une boucle est un ÉNORME problème (et ce n'est plus un ÉNORME problème) ! !!

Une chose est une fonction, même un morceau de code local, mais les boucles....

Je peux me tromper ))))))))

 
Dmitriy Skub:
Vous avez une version obscène du compilateur)

Et j'en suis heureux ))))))))))) Bien que parfois .... Je préférerais qu'il ne dise rien )))))))))))))))))))))))))))))))

 

Si c'est un débat - je veux demander au Gourou.

Ce qui est "correct" (optimal et lisible) :

for (int i=0;i<Bars();i++)
{
// code
}

Ou

int i,MaxBars=Bars()-1;
for (i=MaxBars;i>=0;i--;)
{
// code
}

Si l'ordre des i est indifférent ?

 
Сергей Таболин:

Je ne suis pas un gourou, mais ici, à mon humble avis, déclarer des variables dans une boucle est un ÉNORME problème (et ce n'est plus un ÉNORME problème) ! !!

Une chose est une fonction, même un morceau de code local, mais des boucles....

Je peux me tromper ))))))))

Pas possible, mais définitivement faux. Un seul exemple : Vous passez en revue les postes ouverts. Vous obtenez un ticket de position, utilisez-le pour obtenir d'autres propriétés de position. Il y a deux variantes, soit dans chaque fonction d'obtention de la propriété de position insérer PositionGetTicket(i) ou l'écrire dans une variable une fois et l'utiliser. Mais après la sortie de la boucle, personne n'a besoin de ce ticket... Pourquoi déclarer cette variable dans le corps de la fonction OnTick() ou plus intéressant encore au niveau global ?
 
Mikhail Dovbakh:

Si c'est un débat - je veux demander au Gourou.

Ce qui est "correct" (optimal et lisible) :

Ou

Si l'ordre des i est indifférent ?

Je pense que la première option, parce qu'il n'y a pas de variables supplémentaires, ils utilisent non seulement la mémoire, mais pour moi, encombrer le code - lire plus, mais cela dépend des fonctions que vous appelez imho, si la fonction est rarement utilisé, alors parfois il sera plus lisible, si vous déclarez une variable avec un nom dans le sens de la tâche effectuée.... dans l'ensemble, il s'agit d'un problème créatif ))))

mais en général, ne les écoutez pas, écrivez comme vous voulez - utilisez la langue à votre convenance

SZZ : regardez les exemples de mikrosoft, le style est principalement - déclarations à la fois lors de l'utilisation de variables, fondamentalement obtenir la portée locale, mais sans fanatisme ;))

void SimpleImage::CalculateDrawingRect()
{
    // Load our bitmap if necessary
    if (nullptr == m_bitmap)
    {
        if (FAILED(LoadBitmapFromShellItem()))
        {
            return;
        }
    }

    // Calculate bitmap rectangle
    float  boundingWidth = m_boundingRect.right - m_boundingRect.left;
    float b oundingHeight = m_boundingRect.bottom - m_boundingRect.top;

    float w idth = Direct2DUtility::GetRectWidth(m_clipRect);
    float h eight = Direct2DUtility::GetRectHeight(m_clipRect);

    if (!m_isHorizontal)
    {
        // Swap width and height to calculate boundaries
        float widthTemp = width;
        width = height;
        height = widthTemp;
    }

    if (width > boundingWidth)
    {
        // Width is larger than bounding box. Scale width to fit
        float scale = boundingWidth / width;
        width *= scale;
        height *= scale;
    }
https://github.com/microsoft
Microsoft
Microsoft
  • github.com
This repo is the official home of .NET on GitHub. It's a great starting point to find many .NET OSS projects from Microsoft and the community, including many that are part of the .NET Foundation.
 
Mikhail Dovbakh:

Si c'est un débat - je veux demander au Gourou.

Ce qui est "correct" (optimal et lisible) :

Ou

Si l'ordre des i est indifférent ?

Si vous êtes indifférent, alors.

int i = Bars();

while(i-- > 0) 

{

// code

}

.

Raison: