Declarando variáveis atrás do laço ou dentro do laço? - página 7

 
Alexey Volchanskiy:

Acabamos de encontrar um monte de pessoas que pensam que o compilador zera em variáveis locais, assim como faz em variáveis globais.

E o compilador não faz nenhuma deformação.

Ele faz, string e impressão não são indicadores de trabalho com variáveis

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

possível uso da variável não-inicializada 'c' tst.mq5 16 10

possível uso da variável não-inicializada 'e' tst.mq5 20 17

código gerado 1 1

0 erro(s), 2 advertência(ões), 526 msec decorridos 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;
        }
}

tempo = 1018
soma = 894782460
tempo = 371
soma = 894782460

Não sei por que, mas μl ultrapassa fortemente (e as variantes rand() mais intrincadas).

E para mim é óbvio - tire-o do laço.

 
Alexey Volchanskiy:

Acabamos de encontrar um monte de pessoas que pensam que o compilador zera em variáveis locais, assim como faz em variáveis globais.

E o compilador não dá nenhuma garantia.

Ou .... Eu não sei. Juro, sempre que possível, que recebo.... ))))))

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

Ou .... Eu não sei. Juro assim sempre que posso ter.... ))))))

Você tem uma versão obscena do compilador)
 
Vict:

tempo = 1018
soma = 894782460
tempo = 371
soma = 894782460

Não sei por que, mas μl está muito à frente da curva (e as variantes rand() mais intrincadas).

E para mim é óbvio - tire-o do laço.

Eu não sou nenhum guru, mas aqui, na minha humilde opinião, declarar variáveis em loop é um negócio ENORME (e não é mais um negócio ENORME)!!!

Uma coisa é uma função, mesmo um pedaço de código local, mas loops....

Eu posso estar errado ))))))))

 
Dmitriy Skub:
Você tem uma versão obscena do compilador)

E eu estou feliz com isso ))))))))))) Embora às vezes .... Eu preferia que ele não dissesse nada )))))))))))))))))))))))))))))))

 

Se isto é um debate - quero perguntar ao guru.

O que é "correto" (ótimo e legível):

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

Ou

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

Se a ordem de i for indiferente?

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

Eu não sou nenhum guru, mas aqui, na minha humilde opinião, declarar variáveis em loop é um negócio ENORME (e não é mais um negócio ENORME)!!!

Uma coisa é uma função, mesmo um pedaço de código local, mas loops....

Eu posso estar errado ))))))))

Não é possível, mas definitivamente errado. Apenas um exemplo: Você percorre as posições abertas. Você recebe um bilhete de posição, use-o para obter outras propriedades de posição. Há duas variantes, ou em cada função de obter propriedade de posição insira PositionGetTicket(i) ou escreva-o em uma variável uma vez e use-o. Mas quando o laço é retirado, este bilhete não é necessário. Por que declarar esta variável no corpo da função OnTick() ou ainda mais interessante a nível global?
 
Mikhail Dovbakh:

Se isto é um debate - quero perguntar ao guru.

O que é "correto" (ótimo e legível):

Ou

Se a ordem de i for indiferente?

Eu acho que a primeira opção, porque não há variáveis extras, eles não só usam memória, mas para mim, desorganizam o código - leia mais, mas depende das funções que você chama imho, se a função é raramente usada, então às vezes ela será mais legível, se você declarar uma variável com um nome no sentido da tarefa realizada.... no total, este é um problema criativo ))))

mas geralmente, não os escute, escreva como quiser - use o idioma para sua própria conveniência

SZZ: veja os exemplos da mikrosoft, o estilo principalmente - declarações de uma só vez ao usar variáveis, basicamente obter escopo local, mas sem 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:

Se isto é um debate - quero perguntar ao guru.

O que é "correto" (ótimo e legível):

Ou

Se a ordem de i for indiferente?

Se indiferente, então.

int i = Bars();

while(i-- > 0) 

{

// code

}

.

Razão: