错误、漏洞、问题 - 页 2745

 
fxsaber:

优化的问题。在测试器中,每打一个勾,我都需要得到一个勾,以便进一步工作。我是这样做的。

很明显,这种变体的速度会比较慢。

但是SymbolInfoTick也比较慢,因为它的字符串参数不是通过引用传递的。

是否可以有一个常规的SymbolInfo*重载,其中字符串是通过引用传递的?

最好能有

在优化器中,这些函数被调用了数百亿次。

调用Symbol()总是扩展到访问全局变量_Symbol,以及Digits(), Point(), Period(), GetLastError(), IsStopped(), UninitializeReason()。

 
Ilyas:

Symbol()调用总是展开访问全局变量_Symbol,Digits()、Point()、Period()、GetLastError()、IsStopped()、 UninitializeReason()也是如此。

那么通过引用传递字符串呢?

 
fxsaber:

那么通过引用传递一个字符串呢?

显然,原因是MQL中的一个无法解决的问题--通过const ref将一个字词作为参数传递。

 
fxsaber:

是否可以有常规的 SymbolInfo* 重载,其中字符串是通过引用传递的?

他们会如何帮助?

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

它仍然返回1,而不是2

 
fxsaber:

那么通过引用传递一个字符串呢?

字符串是通过引用传递的。

我们早就改成了 "copy_on_write string"--当把一个字符串复制到另一个内容时,不是立即复制(像以前一样),对字符串缓冲区 的引用数量会增加
。例如,当以值传递字符串,作为一个参数时,引用数量会增加,在调用后会减少。

一个字符串被改变时,将检查缓冲区的引用计数,如果有一个以上的引用,要改变的字符串将从旧的缓冲区中 "解除链接",并分配一个新的。

 
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 string"--当把一个字符串复制到另一个时,内容不会立即被复制(像以前一样),对字符串缓冲区 的引用数量会增加
。例如,当按值传递字符串时,引用数量会增加,作为一个参数,在调用后会减少。

一个字符串被改变时,将检查缓冲区的引用计数,如果有一个以上的引用,改变后的字符串将从旧的缓冲区中 "解除链接",并为其分配一个新的缓冲区。

这些都是在编译层面定义的吗?

 

编译器错误。

class CArray
{  
};

int ArraySize(const CArray&);


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

这些都是在编译层面定义的吗?

不,它在编译时还不知道。