Aiuto con OOP - pagina 4

 
Vasiliy Sokolov #:

Ufficialmente, sì. Non ufficialmente, molte cose indicano che esiste:

  • Non ci sono puntatori in MQL. Invece, sono sostituiti da qualcosa che gli assomiglia molto.
  • Non c'è allocazione diretta della memoria in MQL, come in C per esempio;
  • I programmi in MQL sono eseguiti da una certa macchina virtuale. Renat ne ha scritto brevemente e non una volta;
  • Si può definire l'istanza della classe che sarà liberata automaticamente. Quindi, c'è qualche meccanismo che controlla queste istanze e le rilascia quando necessario. Che cos'è se non un raccoglitore di rifiuti?
  • Qualsiasi istanza inizializzata attraverso un puntatore e non adeguatamente liberata sarà marcata come oggetto leaked all'uscita. Il loro numero e la dimensione totale della memoria persa saranno stampati. Un programma con la memoria persa non sarà nemmeno convalidato nel Market. Quindi tutti gli oggetti, anche quelli assegnati manualmente, sono contabilizzati, conosciuti e noti al sistema. Questo è uno dei classici compiti che lo spazzino risolve.

C'è un'indicazione sufficiente e completa che non c'è un raccoglitore di rifiuti in emcool - la cancellazione è obbligatoria dopo il nuovo.

 
Dmitry Fedoseev #:

C'è un'indicazione sufficiente e sufficiente che non c'è un raccoglitore di rifiuti in emcool - la cancellazione è obbligatoria dopo il nuovo.

Per quanto mi ricordo, uno degli sviluppatori ha riconosciuto che c'è un raccoglitore di rifiuti. Ma per l'utente "più o meno non esiste".

Beh, riguardo alla coppia nuovo-cancellato - sono d'accordo. In generale, gli oggetti che hanno richiesto le risorse devono esserne responsabili. Ci sono eccezioni, come la "fabbrica di oggetti" - ma lì si assume specificamente che la responsabilità per gli oggetti creati è di colui che ha richiesto questi oggetti dalla fabbrica.

Non mi piace la situazione nelle lingue in cui c'è il nuovo e la cancellazione non è richiesta, perché il "sistema farà pulizia". Questo non solo riduce potenzialmente le prestazioni (quando gli oggetti non necessari non vengono ancora rimossi), ma rilassa anche il codificatore, permettendogli di non preoccuparsi delle conseguenze delle sue azioni.

 
Georgiy Merts #:

Non mi piace molto la situazione nelle lingue dove c'è il nuovo, ma la cancellazione non è richiesta, dicendo "il sistema rimuoverà il superfluo". Questo non solo riduce potenzialmente le prestazioni (quando gli oggetti non necessari non vengono ancora rimossi), ma rilassa anche il codificatore, permettendogli di non preoccuparsi delle conseguenze delle sue azioni.

La produttività, d'altra parte, è generalmente migliorata. La rimozione manuale richiede molto tempo nel thread principale. + la cancellazione avviene elemento per elemento. Confrontate le due versioni dello script in questo thread, per esempio. La differenza di velocità è di diverse volte. Anche l'efficienza della memoria sale. Perché il raccoglitore di rifiuti sposta gli oggetti compattati tra loro. Se lo si gestisce manualmente, si creano dei buchi di memoria liberi che non sono così facili da riutilizzare. Inoltre, il garbage collector lavora in un altro thread. Il tempo di base non è sprecato. Tutto sommato, un vantaggio.

 
Vasiliy Sokolov #:

La produttività al contrario è generalmente aumentata. La rimozione manuale richiede una notevole quantità di tempo nel flusso principale. + la cancellazione avviene elemento per elemento. Confronta due versioni dello script in questo thread, per esempio. La differenza di velocità è di diverse volte. Anche l'efficienza della memoria sale. Perché il raccoglitore di rifiuti sposta gli oggetti compattati tra loro. Se lo si gestisce manualmente, si creano dei buchi di memoria liberi che non sono così facili da riutilizzare. Inoltre, il garbage collector lavora in un altro thread. Il tempo di base non è sprecato. Tutto sommato, è solo un vantaggio.

Vasily, mi dispiace, ma non capisci affatto di cosa stai cercando di parlare. Per niente e in nessun modo.

Almeno leggi su Wikipedia cos'è un raccoglitore di rifiuti. La sua principale peculiarità è che rimuove gli oggetti con i quali si è persa la comunicazione.

Solo che in questo caso si chiamerebbe un raccoglitore di rifiuti. Questi due copioni sono di una storia diversa. Il dono di Dio non deve essere confuso con un uovo.

E perché un garbage collector dovrebbe improvvisamente aumentare la produttività? È un'imbottitura in più tra il codice utile e l'hardware, e non una debole.

 
Georgiy Merts #:

Se ricordo bene, uno degli sviluppatori ha riconosciuto che il raccoglitore di rifiuti esiste. Ma per l'utente è "un po' sparito".

///

Questo deve essere il "garbage collector" che dà un messaggio di perdita di memoria alla fine del lavoro.

Forse cancella anche gli oggetti abbandonati. Ma anche se li rimuove, c'è un grande

differenza - li cancella solo alla fine del lavoro. E se in un ciclo plurimo vengono creati nuovi oggetti?

nuovi oggetti? Il programma sarà inutilizzabile, non c'è abbastanza memoria.

Un vero assemblatore cancella gli oggetti persi durante l'operazione del programma, non

solo alla fine del programma. Ecco perché è permesso uno stile di programmazione speciale.

possiamo moltiplicare gli oggetti in qualsiasi condizione e in qualsiasi quantità.

 
Vasiliy Sokolov #:

La produttività al contrario è generalmente aumentata. La rimozione manuale richiede una notevole quantità di tempo nel flusso principale. + la cancellazione avviene elemento per elemento. Confronta due versioni dello script in questo thread, per esempio. La differenza di velocità è di diverse volte. Anche l'efficienza della memoria sale. Perché il raccoglitore di rifiuti sposta gli oggetti compattati tra loro. Se lo si gestisce manualmente, si creano dei buchi di memoria liberi che non sono così facili da riutilizzare. Inoltre, il garbage collector lavora in un altro thread. Il tempo di base non è sprecato. Tutto sommato, un vantaggio.

Hmm... E in un raccoglitore di rifiuti, la cancellazione non è elementare? Senza contare che l'altro thread, quando non ci sono core liberi, viene eseguito dallo stesso core, e rallenta il thread principale.

Secondo me, in generale, con un'attenta considerazione, la rimozione dei rifiuti da parte dell'utente è sempre più efficiente della rimozione da parte del garbage collector. Tuttavia, se non ti interessa, lo spazzino vince sicuramente.

Ecco perché non mi piace il garbage collector, perché incoraggia questo stesso trattamento indifferente delle risorse.

 
Dmitry Fedoseev #:

Questo deve essere l'"assemblatore" che dà il messaggio sulle perdite di memoria quando il lavoro è finito.

Probabilmente cancella anche gli oggetti rimasti. Ma anche se li cancella, c'è un grande

differenza - li cancella solo alla fine del lavoro. E se in un ciclo plurimo vengono creati nuovi oggetti?

nuovi oggetti? Il programma sarà inutilizzabile, non c'è abbastanza memoria.

Un vero assemblatore cancella gli oggetti persi durante l'operazione del programma, non

solo alla fine del programma. Ecco perché è permesso uno stile di programmazione speciale.

possiamo moltiplicare gli oggetti in qualsiasi condizione e in qualsiasi quantità.

Proprio così. Ecco perché non mi piace lavorare con l'assemblatore - l'utente non fa attenzione a quanti oggetti ha creato e dove.

Fondamentalmente, semplifica anche lo sviluppo in qualche modo - non devi ricordarti di cancellare quello occupato. Builder trova il momento in cui l'oggetto non è più referenziato, e lo rimuove. Ma questa posizione mi disgusta. È a causa di questa posizione che abbiamo programmi che girano sempre più lentamente, che hanno bisogno di risorse hardware sempre più potenti per compiti di complessità simile.

 
Dmitry Fedoseev #:

Vasily, mi dispiace, ma tu non capisci assolutamente nulla di quello che stai cercando di argomentare. Niente di niente e in nessun modo.

Dmitry, mi scusi, conosce un altro linguaggio di programmazione oltre a mukl? No, non è vero. E non hai ancora imparato a lavorare con oggetti e puntatori, è chiaro da quei pochi codici e persino articoli che hai pubblicato. Ecco perché non posso nemmeno rispondere seriamente a questo commento senza talento e francamente stupido. Leggi finalmente wikipedia, impara cos'è un raccoglitore di rifiuti e come è organizzato, infine leggi almeno una volta quello a cui stai cercando di fare riferimento. Finora, tutto sembra come un cane che abbaia a una carovana: senza senso e senza pietà.
 
Georgiy Merts #:

Hmmm... E nel raccoglitore di rifiuti la cancellazione non è elementare? Per non parlare del fatto che un altro thread, quando non ci sono core liberi - è fatto dallo stesso core, e rallenta il thread principale.

Secondo me, in generale, con un'attenta considerazione, la rimozione dei rifiuti da parte dell'utente è sempre più efficiente della rimozione da parte del garbage collector. Tuttavia, se non ti interessa, lo spazzino vince sicuramente.

Ecco perché non mi piace il garbage collector, incoraggia questo stesso trattamento indifferente delle risorse.

Piuttosto che fare supposizioni su come funziona un garbage collector, basta confrontare la velocità della rimozione automatica degli oggetti con la rimozione manuale. Tutte le fantasie svaniranno all'istante.

 
Vasiliy Sokolov #:

confrontare le velocità della rimozione automatica degli oggetti e della rimozione manuale degli oggetti.

La risposta è preferibilmente subito. Non c'è sempre tempo per gli esperimenti.

Motivazione: