Объявление переменных за циклом или внутри цикла? - страница 7

 
Alexey Volchanskiy:

Просто встречал кучу людей, которые думают, что компилятор обнуляет локальные переменные так же, как глобальные.

А варнингов компилятор не выдает

выдает, стринг и принт   не показатель работы с переменными

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

possible use of uninitialized variable 'c' tst.mq5 16 10

possible use of uninitialized variable 'e' tst.mq5 20 17

code generated 1 1

0 error(s), 2 warning(s), 526 msec elapsed 1 3

 
//c++
int main() {
        int count= (int)10e6;
        {
                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;
        }
}

time = 1018
sum = 894782460
time = 371
sum = 894782460

Х.з. почему, но мкл сильно обгоняет (и более затейливые варианты с rand()).

А для меня очевидно - выносить за цикл.

 
Alexey Volchanskiy:

Просто встречал кучу людей, которые думают, что компилятор обнуляет локальные переменные так же, как глобальные.

А варнингов компилятор не выдает

Или .... ну я не знаю. У меня так матерится при каждом удобном случае.... ))))))

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

Или .... ну я не знаю. У меня так матерится при каждом удобном случае.... ))))))

У Вас нецензурная версия компилятора)
 
Vict:

time = 1018
sum = 894782460
time = 371
sum = 894782460

Х.з. почему, но мкл сильно обгоняет (и более затейливые варианты с rand()).

А для меня очевидно - выносить за цикл.

Я не гуру, но тут, на мой скромный взгляд, объявление переменных в цикле - это вооще ХЗ (и это уже не Хто Знает) !!!

Одно дело - функция, даже локальный кусок кода, а циклы.... 

Возможно, я и не прав ))))))))

 
Dmitriy Skub:
У Вас нецензурная версия компилятора)

И я этому рад ))))))))))) Хотя иногда .... лучше бы он молчал )))))))))))))))))))))))))))))))

 

Если пошли такие дебаты - хочу спросить Гуру.

Что "правильнее"(оптимальнее и читабельней):

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

Или

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

если порядок следования i безразличен?

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

Я не гуру, но тут, на мой скромный взгляд, объявление переменных в цикле - это вооще ХЗ (и это уже не Хто Знает) !!!

Одно дело - функция, даже локальный кусок кода, а циклы.... 

Возможно, я и не прав ))))))))

Не возможно, а точно не прав. Только один пример: В цикле перебираешь открытые позиции. Получаешь тикет позиции, используешь его для получения других свойств позиции. Вариантов два, либо в каждую функцию получения свойства позиции вставлять PositionGetTicket(i) либо один раз записать его в переменную и использовать её. Но ведь при выходе из цикла этот тикет уже никому не нужен... зачем эту переменную объявлять в теле функции OnTick() или ещё интересней на глобальном уровне?
 
Mikhail Dovbakh:

Если пошли такие дебаты - хочу спросить Гуру.

Что "правильнее"(оптимальнее и читабельней):

Или

если порядок следования i безразличен?

я думаю, что первый вариант, ибо нет лишних переменных, они мало того, что используют память, так и по мне, загромождают код - читать больше, но зависит от вызываемых функций имхо, если функции редко употребляются, то иногда читабельнее будет если обьявить переменную с именем по смыслу выполняемой задачи.... в общем творческая это задача   )))

но в общем нечего кого слушать, как удобно так и пишем - т.е. используем возможности языка для своего удобства

ЗЫ: глянул примеры от Майкрософт, стиль в основном - объявления сразу при использовании переменных, в основном получается локальная область видимости, но без фанатизма ))

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 boundingHeight = m_boundingRect.bottom - m_boundingRect.top;

    float width = Direct2DUtility::GetRectWidth(m_clipRect);
    float height = 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:

Если пошли такие дебаты - хочу спросить Гуру.

Что "правильнее"(оптимальнее и читабельней):

Или

если порядок следования i безразличен?

Если безразличен то

int i = Bars();

while(i-- > 0) 

{

// code

}

.

Причина обращения: