Bug del compilatore con il parametro template = void* - pagina 19

 
pavlick_:

Autodistruzione? - questo è nuovo :).

Sì, autodistruzione. Suppongo che tu sappia che questa è la differenza tra gli oggetti "stack" e gli oggetti dinamici - non ti chiedono quando cancellarsi, lo fanno quando escono dal blocco di programma originario :)
 
Ilya Malev:
Sì, autodistruzione. Suppongo che tu sappia che questa è la differenza tra gli oggetti "stack" e gli oggetti dinamici - non ti chiedono quando cancellarsi, lo fanno quando escono dal blocco di programma originario :)

Probabilmente avete sentito parlare dei costruttori/operatori di copia/spostamento, giusto?

obj o;
{
   obj q;
   o = q;
   o = move(q);  // С++ вариант, более эффективный
}
 
pavlick_:

Probabilmente avete sentito parlare dei costruttori/operatori di copia/spostamento, giusto?

Quindi staremo all'erta per quel momento cruciale e lo copieremo così, se solo non saremo troppo in ritardo? :lol:

Solo perché non ci piace l'OOP, o ci sono altre ragioni?

 
Ilya Malev:

Quindi staremo all'erta per quel momento cruciale e lo copieremo così, se solo non saremo troppo in ritardo? :lol:

Solo perché non ci piace l'OOP, o ci sono altre ragioni?

Certo, come potrebbe essere altrimenti? Anche tu, come proger decente, devi gestire gli oggetti dinamici tramite gli stack (tecnica RAII)

{
   unique_ptr<Class> p(new Class);
   ...
   // ой, самоуничтожение :)
}
 
E faremo un sacco di involucri per questo, dannazione. Perché la nicchia del polimorfismo non è così significativa, ma le nostre stampelle hanno tutto un campo di applicazione, se non usiamo OOP :cry:
 
pavlick_:

Certo, come potrebbe essere altrimenti? Come proger decente, dovete gestire anche gli oggetti dinamici tramite oggetti stack (tecnica RAII).

Intende lo spazzino? )))) o sul conteggio del numero di riferimenti. ho fatto pratica con queste cose ultimamente. ma le prestazioni di tutti questi approcci sono penose in µl purtroppo

 
Gestire gli oggetti din.tramite lo stack significa allocare 24 byte di memoria AGGIUNTIVI per ogni oggetto (questo è quanto "peserà" tale "puntatore allo stack "+riferimento all'oggetto stesso). Inoltre il costo in termini di tempo e di velocità non è affatto piccolo. Tutto questo è piuttosto triste nell'insieme. Ma non ne sentiamo nemmeno un grande bisogno. Come si dice, la paura ha molti occhi. Se stavamo programmando stazioni spaziali, allora non si potrebbe fare a meno di un controllo rigoroso. Ma così com'è, con un sistema di classi ben tarato, tutto funziona bene anche senza.
 

No, non sul raccoglitore di spazzatura, ma sui puntatori intelligenti - unique_ptr, shared_ptr (con conteggio dei riferimenti), RAII facilmente googlato. Generalmente non c'è un costo extra per unique_ptr in termini di memoria (wrapper == dimensione del puntatore), e le chiamate sono sovra-ottimizzate, ma in µl tutto è triste, sì. Ma non è necessario nemmeno qui (puntatori intelligenti).

 
pavlick_:

Oppure potreste prendere i modelli e scrivere qualcosa come:

https://www.mql5.com/ru/forum/295485/page18#comment_9971363

Button è anche indipendente dai dettagli, senza tutto il polimorfismo e le interfacce. Il polimorfismo ha la sua nicchia, ma è molto più ristretta di quanto si dica.

In un esempio così semplificato, il modello sembra certamente più conveniente. In effetti, non hai nemmeno bisogno di un modello lì, dato che hai solo un'istanza.

 
Alexey Navoykov:

Questo esempio semplificato rende certamente il modello più conveniente. In effetti, non hai nemmeno bisogno di un modello lì, dato che hai solo un'istanza.

Lampada a bottone via g con virtualità:

struct SwitchableDevice {
    virtual void switchOn() = 0;
    virtual void switchOff() = 0;
};
struct Lamp : SwitchableDevice {
    void switchOn(){std::cout << "shine bright" << std::endl;}
    void switchOff(){std::cout << "i am not afraid of the dark" << std::endl;}
};
struct Button {
    SwitchableDevice& dev;
    bool state = false;
    Button(SwitchableDevice& d) : dev(d) {}
    void buttonPress(){
        if (state) { dev.switchOff(); }
        else       { dev.switchOn();  }
        state = !state;
    }
};
int main(){
    Lamp lamp;
    Button button(lamp);
    button.buttonPress();
    button.buttonPress();
}

Esempi banali.