Não há problema... há um erro. Também não percebo porque está a tentar arrancar a explicação da sua cabeça. A impressão por defeito tem a seguinte assinatura:
E também pode colidir com outras funções (se necessário)
A assinatura de impressão está fora do alcance da linguagem MQL5. Se a MQL5 proibir de todo a sobrecarga de impressão, não será um bug.
Espero que este "bug" não o impeça de criar TS e não exija muletas de escrita.
Medi o desempenho do Testador. Para o fazer, abri e fechei uma posição em cada carrapato. Medi o tempo de execução de 100 ticks. Passei-o por 100 000 carraças. Medi um total de 1000 ticks. Tenho este gráfico
Há picos de desaceleração a distâncias quase iguais entre eles. Medi-o no modo Optimização. Se eu ignorar esses picos o desempenho do testador varia 25% em vez do valor constante. Talvez sejam novamente truques de medição de velocidade do Windows.
ZZZ O mesmo código está a correr no MT4
Em média, o MT4 Tester leva 1,5-2 vezes menos tempo a processar um tick do que o MT5.
... Em cada tic abriu e fechou uma posição. <br / translate="no"> Em média, o MT4-Tester leva 1,5-2 vezes menos tempo a processar um tick do que o MT5.
void f()
{
for ( int i = 0;; )
{
Print( i );
int i = 5; //Warning: declaration of 'i' hides local declarationPrint( i );
break;
}
}
void For( int i = 0 )
{
Print( i );
int i = 5; //Error: redefinition of formal parameter 'i'Print( i );
}
Qual é a diferença fundamental? Em C++, por exemplo, há um erro em ambos os casos
Peço a ajuda de pessoas conhecedoras para compreender a questão das indicações para as instâncias das aulas. Não o compreendo.
Aqui está um exemplo do guião:
class A
{
public :
A() { Print("Start"); };
~A() {
Print("End");
Print(EnumToString(CheckPointer(GetPointer(this))));
if (CheckPointer(GetPointer(this))!=POINTER_DYNAMIC)
deleteGetPointer(this);};
};
A a;
voidOnStart()
{
}
se uma instância de uma classe for declarada como:
A *a= new A;
então na execução que temos:
2018.09.2321:46:42.960 Test_CheckPointer (EURUSD,M1) Start
2018.09.2321:46:42.961 Test_CheckPointer (EURUSD,M1) 1 undeleted objects left
2018.09.2321:46:42.961 Test_CheckPointer (EURUSD,M1) 1 object of type A left
2018.09.2321:46:42.961 Test_CheckPointer (EURUSD,M1) 32 bytes of leaked memory
ou seja, o destruidor nem sequer é iniciado e, portanto, a memória não é libertada.
Mas se uma instância de uma classe for declarada como tal:
A a= new A;
o construtor é lançado duas vezes, o destruidor - uma vez, mas a memória não é libertada e temos o tipo de ponteiro de objectosPOINTER_AUTOMÁTICO, embora se destinasse a serPOINTER_DYNAMIC
2018.09.2321:54:24.844 Test_CheckPointer (EURUSD,M1) Start
2018.09.2321:54:24.844 Test_CheckPointer (EURUSD,M1) Start
2018.09.2321:54:24.844 Test_CheckPointer (EURUSD,M1) End
2018.09.2321:54:24.844 Test_CheckPointer (EURUSD,M1) POINTER_AUTOMATIC2018.09.2321:54:24.844 Test_CheckPointer (EURUSD,M1) 1 undeleted objects left
2018.09.2321:54:24.845 Test_CheckPointer (EURUSD,M1) 1 object of type A left
2018.09.2321:54:24.845 Test_CheckPointer (EURUSD,M1) 32 bytes of leaked memory
Como executar sempre o destruidor e executar correctamente apagar
Não há problema... há um erro. Também não percebo porque está a tentar arrancar a explicação da sua cabeça. A impressão por defeito tem a seguinte assinatura:
E também pode colidir com outras funções (se necessário)
A assinatura de impressão está fora do alcance da linguagem MQL5. Se a MQL5 proibir de todo a sobrecarga de impressão, não será um bug.
Espero que este "bug" não o impeça de criar TS e não exija muletas de escrita.
Medi o desempenho do Testador. Para o fazer, abri e fechei uma posição em cada carrapato. Medi o tempo de execução de 100 ticks. Passei-o por 100 000 carraças. Medi um total de 1000 ticks. Tenho este gráfico
Há picos de desaceleração a distâncias quase iguais entre eles. Medi-o no modo Optimização. Se eu ignorar esses picos o desempenho do testador varia 25% em vez do valor constante. Talvez sejam novamente truques de medição de velocidade do Windows.
ZZZ O mesmo código está a correr no MT4
Em média, o MT4 Tester leva 1,5-2 vezes menos tempo a processar um tick do que o MT5.
Possivelmente, surge através da utilização de um algoritmo de optimização genética.
Em média, o MT4-Tester leva 1,5-2 vezes menos tempo a processar um tick do que o MT5.
Possivelmente, surge através da utilização de um algoritmo de optimização genética.
Sem AG. Optimização a partir de dois passes num só Agente.
E isto já é pura manipulação e engano.
O código fonte está em vigor.
Num caso, um aviso, no outro, um erro
Qual é a diferença fundamental? Em C++, por exemplo, há um erro em ambos os casos
Peço a ajuda de pessoas conhecedoras para compreender a questão das indicações para as instâncias das aulas. Não o compreendo.
Aqui está um exemplo do guião:
Ao executá-lo temos, como se esperava:
se uma instância de uma classe for declarada como:
A *a= new A;então na execução que temos:
ou seja, o destruidor nem sequer é iniciado e, portanto, a memória não é libertada.
Mas se uma instância de uma classe for declarada como tal:
A a= new A;o construtor é lançado duas vezes, o destruidor - uma vez, mas a memória não é libertada e temos o tipo de ponteiro de objectosPOINTER_AUTOMÁTICO, embora se destinasse a serPOINTER_DYNAMIC
Como executar sempre o destruidor e executar correctamente apagar
Как добиться всегда выполнения деструктора и правильного выполнения delete.
Ver de C++ o tópico de apontadores inteligentes e adaptar para MQL(https://habr.com/post/140222/).
Talvez haja algo na kodobase...
Ver de C++ o tópico de apontadores inteligentes e adaptar para MQL(https://habr.com/post/140222/).
Talvez haja algo na kodobase...
obrigado, mas não vi aí nenhuma resposta às minhas perguntas.
Não compreendo porque é que o destruidor não é chamado quandoA *a= novo A;
Obrigado, mas não vi aí nenhuma resposta às minhas perguntas.
Não compreendo porque é que o destruidor não é chamado quandoA *a= novo A;
Resultado:
1:POINTER_AUTOMÁTICO
1:POINTER_DYNAMIC
2:POINTER_DYNAMIC
2:POINTER_AUTOMÁTICO
Obrigado, mas não vi aí nenhuma resposta às minhas perguntas.
Não compreendo porque é que o destruidor não é chamado quandoA *a= novo A;
Criar com novo e apagar com apagar