Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Il mio primo template. Come vado?
Forum - C/C++ - Il mio primo template. Come vado? - Pagina 3

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 22:39
Lunedì, 10/09/2018
Riguardo alla STL... Nemmeno io sono un esperto. Ne conosco una piccolissima porzione e sto anch'io cercando di estendere la mia conoscenza, ed è proprio per questo che mi sforzo di fare le cose nel modo più C++-oso possibile: ne guadagno in compatibilità fra compilatori e sistemi operativi, e ad ogni miglioria fatta da altri alla STL il mio programma migliora... Gratis. Senza sforzo, basta solo ricompilarlo.

Prendi l'esempio di pthread: puoi usare pthread su linux, mac, freebsd ecc... Ma nativamente non su windows, perché ti serve un porting che potrebbe rimanere abbandonato, e comunque non è completo e non lo sarà mai. Poi considera una implementazione ben fatta di thread nella STL... È multipiattaforma e non usa wrapper inutili, quindi prestazioni native per ogni OS. La STL anche in questo caso vince.

Considera la libreria regex nella STL nello standard C++11. L'equivalente in C non esiste... Dovresti usare una libreria esterna, con ciò che questo comporta, quando c'è una ottima implementazione nella STL di g++ e clang!

PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 22:49
Lunedì, 10/09/2018
Se vuoi migliorare il tuo prodotto finale cura il codice, mantienilo sempre pulito e coerente con se stesso il più possibile.
Assicurati di usare sempre tool di sviluppo aggiornati e vedrai che avrai grandissimi benefici con nessuno sforzo mentale e codice di facile comprensione ed interpretazione. Per te e per gli altri!

Ancora, adesso tu hai un delete dove ti serviva. Aggiungi un campo a MATRICE<> cerchi la funzione Distruggi().... Non c'è. Devi cercare delete... Ipotizziamo che ne trovi 5... O spammi altri 5 delete alla ceca o crei Distruggi() e sostituisci ad ogni delete una chiamata a Distruggi(). Hai perso 3 minuti per non lasciar fare al compilatore le ottimizzazioni dovute. Non ti sembra una stupidaggine? Poi magari ti accorgi che per aver spammato 5 delete ha mandato il programma in segfault, perché dodvevi fare un controllo prima di cancellare la memoria e devi modificarlo ancora una volta, per altre 5 volte. E devi fare il debug. A questo punto avrai perso mezz'ora su una stupidaggine.

Posso farti altri esempi se vuoi, ma credo che questo basti.

PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 15:24
Martedì, 11/09/2018
Bene, il 90% delle cose che hai scritto trova posto e consenso nella mia testolina. Che poi mi riesca di renderle "operative" è un altro discorso, però senz'altro da ora in poi terrò conto di quel che mi hai detto.

Parlavo del 90%, perché questa cosa qui non l'ho capita:

"Immagina z definito come x*y e una funzione getZ che fa: if (hasenso(z)) return z; else return z=x*y;" (e quel che segue in merito)

Sarò anche uno zuccone, ma saresti così gentile da aiutarmi a capire cosa mi stai dicendo?

Ah, un'altra cosa (mi vengono in mente a raffica man mano che leggo e scrivo): queste due cose vengono "tradotte" dal compilatore in modo esattamente identico?

if (hasenso(z)) return z; else return z=x*y;

return hasenso(z) ? z : z=x*y;

Intendo: è solo un modo per "sintetizzare" visivamente un procedimento che poi però finisce per dar luogo alle stesse istruzioni impartite a basso livello o ci sono differenze "di sostanza" tra una forma e l'altra?


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 18:34
Martedì, 11/09/2018
Si il mio if e la tua riscrittura dell'operatore ternario vengono tradotte allo stesso modo.

Ciò che ti sto dicendo è che se l'operazione non è di lunga durata non ha senso crearne una cache, complichi il codice e basta.

PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 19:31
Martedì, 11/09/2018
Ah, allora avevo capito giusto. Come faccio, però, a definire se "vale la pena" o no, ovvero dove sta il limite tra operazione abbastanza complessa da renderne conveniente l'immagazzinamento in una variabile e operazione così semplice da renderlo inutile/dannoso? Ci sono dei criteri o si va "a spanne" (il sistema spannometrico è uno dei miei preferiti, perché puoi far finta di sapere cosa stai facendo anche se non è vero :rotfl: ).


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 449
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 21:32
Martedì, 11/09/2018
Ciao, come al solito sono sempre di fretta e non riesco mai a rispondere a modo, comunque per quanto riguarda la ripetizione di espressioni so che esiste un tipo di ottimizzazione fatto dai compilatori che se ne occupa:
https://en.wikipedia.org/wiki/Common_subexpression_elimination

In pratica non c'è quasi mai un modo spannometrico, bisogna guardare il codice generato e capire cosa succede, ma bisogna preoccuparsi davvero tanto delle performance per arrivare a questo punto. Per questo la cosa migliore è scrivere codice ragionevole, comprensibile e semplice, ottimizzare a spanne di solito non funziona

PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 23:37
Martedì, 11/09/2018
Comunque AldoBaldo sono dell'idea che dovresti solo scrivere buon codice e lasciare al compilatore tutti gli oneri.

Una funzione getZ() {return x*y; } è sicuramente quanto meglio puoi fare, perché il codice è pulito, chiaro e non spargi in giro artifici per controllare la cache.

Ammiro la tua determinazione nel voler codice velocissimo, ma per ottenere questo risultato c'è molto più da investire di ciò che pensi e se non stai eseguendo operazioni critiche, come un firmware per microonde, apparecchi elettromedicali, assistenti di guida o giochi (per cui tra un frame e laltro deve passare meno tempo possibile per accomodare l'occhio umano) non ne vale la pena, perché c'è un uso sicuramente molto migliore del tuo tempo.

PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 19:23
Mercoledì, 12/09/2018
Giusto per interloquire, devo dire che di solito le mie "preoccupazioni" sono indirizzate più verso la possibilità di generare crash improvvisi per qualche gestione incongrua degli errori, oppure sulla possibilità di farmi sfuggire leaks qua e là senza rendermene conto. Le "preoccupazioni" aumentano tanto più quanto più uso chiamate che fanno riferimento a codice che non ho scritto in prima persona, non perché non mi fidi di chi lo ha scritto, ma perché ci vuole un attimo a perdersi qualche dettaglio della documentazione e usare MALE gli strumenti forniti da altri. Le API di Windows sono un esempio più che calzante per capire cosa intendo...

Questo spiega il perché del mio modo di scrivere tante volte pletorico, che Lumo ha definito (tempo fa) "difensivo". Con grande ragione.


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo