Ошибки, баги, вопросы - страница 2745

 
fxsaber:

Вопрос по оптимизации. В Тестере на каждом тике нужно получить тик для дальнейшей работы. Делаю это так.

Понятно, что этот вариант будет медленнее:

Но еще тормозит SymbolInfoTick, потому что string-параметр передается не по ссылке.

Возможно ли иметь штатные SymbolInfo*-перегрузки, где string передается по ссылке?

А лучше, конечно, иметь

В Оптимизаторе эти функции вызываются десятки миллиардов раз.

вызов функции Symbol() ВСЕГДА разворачивается в доступ к глобальной переменной _Symbol, как и Digits(), Point(), Period(), GetLastError(), IsStopped(), UninitializeReason()

 
Ilyas:

вызов функции Symbol() ВСЕГДА разворачивается в доступ к глобальной переменной _Symbol, как и Digits(), Point(), Period(), GetLastError(), IsStopped(), UninitializeReason()

А передача string по ссылке?

 
fxsaber:

А передача string по ссылке?

Видимо причина в одной из нерешаемых проблем в MQL - передача литерала в качестве параметра по const ref. 

 
fxsaber:

Возможно ли иметь штатные SymbolInfo*-перегрузки, где string передается по ссылке?

А как они помогут?

int SymbolInfoTick( string  symbol ) { return 1; }
int SymbolInfoTick( string& symbol ) { return 2; }
void OnStart()
{
        Print( SymbolInfoTick( _Symbol ));
}

Все равно возвращается(вызывается) 1, а не 2

 
fxsaber:

А передача string по ссылке?

Строка передаётся по ссылке.

Мы уже давно перешли на "copy_on_write строки" -> при копировании одной строки в другую контент не копируется сразу (как это было раньше), увеличивается количество ссылок на буфер строки
Например, количество ссылок увеличивается при передаче строки по значению, в качестве параметра и уменьшается после вызова.

Когда строка меняется, проверятся счётчик ссылок на буфер и если ссылок больше одной, то изменяемая строка "отцепляется" от старого буфера и ей выделяется новый.

 
A100:

А как они помогут?

Все равно возвращается(вызывается) 1, а не 2

переменная _Symbol константная
 
Ilyas:
переменная _Symbol константная

Тогда перегрузка тем более не поможет

int SymbolInfoTick(       string  ) { return 1; }
int SymbolInfoTick( const string& ) { return 2; }
void OnStart()
{
        Print( SymbolInfoTick( _Symbol )); //Error
}

будет ошибка уже при компиляции

 
Ilyas:

Строка передаётся по ссылке.

Мы уже давно перешли на "copy_on_write строки" -> при копировании одной строки в другую контент не копируется сразу (как это было раньше), увеличивается количество ссылок на буфер строки
Например, количество ссылок увеличивается при передаче строки по значению, в качестве параметра и уменьшается после вызова.

Когда строка меняется, проверятся счётчик ссылок на буфер и если ссылок больше одной, то изменяемая строка "отцепляется" от старого буфера и ей выделяется новый.

Это все на уровне компиляции определяется?

 

Ошибка компилятора:

class CArray
{  
};

int ArraySize(const CArray&);


void Main()
{
  CArray arr;
  ArraySize(arr);  // Нормально
  
  CArray arrays[1];
  ArraySize(arrays[0]); // 'arrays' - array required
}
 
fxsaber:

Это все на уровне компиляции определяется?

Нет. Во время компиляции это ещё неизвестно.

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