¿Declaración de variables detrás del bucle o dentro del bucle? - página 7

 
Alexey Volchanskiy:

Acabo de conocer a un grupo de personas que piensan que el compilador se centra en las variables locales igual que en las globales.

Y el compilador no da barnices.

Lo hace, string y print no son indicadores de trabajo con 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

posible uso de la variable no inicializada 'c' tst.mq5 16 10

posible uso de la variable no inicializada 'e' tst.mq5 20 17

código generado 1 1

0 error(es), 2 advertencia(s), 526 mseg transcurridos 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;
        }
}

tiempo = 1018
suma = 894782460
tiempo = 371
suma = 894782460

No sé por qué, pero μl se adelanta con fuerza (y las variantes más intrincadas de rand()).

Y para mí es obvio: sacarlo del bucle.

 
Alexey Volchanskiy:

Acabo de conocer a un grupo de personas que piensan que el compilador se centra en las variables locales igual que en las globales.

Y el compilador no da ninguna orden.

O .... No lo sé. Lo hago jurar en cada oportunidad que tengo.... ))))))

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

O .... No lo sé. Juro así cada vez que puedo.... ))))))

Tienes una versión obscena del compilador)
 
Vict:

tiempo = 1018
suma = 894782460
tiempo = 371
suma = 894782460

No sé por qué, pero μl está muy por delante de la curva (y de las variantes más intrincadas de rand()).

Y para mí es obvio: sacarlo del bucle.

No soy ningún gurú, pero aquí, en mi humilde opinión, declarar las variables en un bucle es algo ENORME (¡¡¡y ya no lo es!!!).

Una cosa es una función, incluso un trozo de código local, pero loops....

Puedo estar equivocado ))))))))

 
Dmitriy Skub:
Tienes una versión obscena del compilador)

Y me alegro de ello ))))))))))) Aunque a veces .... Preferiría que no dijera nada )))))))))))))))))))))))))))))))

 

Si esto es un debate, quiero preguntarle al Gurú.

Lo que es "correcto" (óptimo y legible):

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

O

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

¿Si el orden de i es indiferente?

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

No soy ningún gurú, pero aquí, en mi humilde opinión, declarar las variables en un bucle es algo ENORME (¡¡¡y ya no lo es!!!).

Una cosa es una función, incluso un trozo de código local, pero loops....

Puedo estar equivocado ))))))))

No es posible, pero definitivamente está mal. Sólo un ejemplo: Se hace un bucle a través de las posiciones abiertas. Si obtienes un ticket de posición, úsalo para obtener otras propiedades de posición. Hay dos variantes, o bien en cada función de obtención de la propiedad de la posición insertar PositionGetTicket(i) o escribirlo en una variable una vez y utilizarlo. Pero cuando se sale del bucle esta entrada no es necesaria... ¿Por qué declarar esta variable en el cuerpo de la función OnTick() o, aún más interesante, a nivel global?
 
Mikhail Dovbakh:

Si esto es un debate, quiero preguntarle al Gurú.

Lo que es "correcto" (óptimo y legible):

O

¿Si el orden de i es indiferente?

Creo que la primera opción, porque no hay variables adicionales, no sólo utilizan la memoria, pero para mí, el desorden del código - leer más, pero depende de las funciones que usted llama imho, si la función se utiliza raramente, entonces a veces será más legible, si se declara una variable con un nombre en el sentido de la tarea realizada.... en definitiva, se trata de un problema creativo ))))

pero, en general, no les hagas caso, escribe como quieras: utiliza el lenguaje a tu conveniencia

SZZ: mira los ejemplos de mikrosoft, el estilo en su mayoría - declaraciones a la vez utilizando variables, básicamente obtener alcance local, pero sin fanatismo ))

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 esto es un debate, quiero preguntarle al Gurú.

Lo que es "correcto" (óptimo y legible):

O

¿Si el orden de i es indiferente?

Si es indiferente entonces.

int i = Bars();

while(i-- > 0) 

{

// code

}

.

Razón de la queja: