Arutelu:Mall (programmeerimine)

Allikas: Vikipeedia
Mine navigeerimisribale Mine otsikasti

Mallide kombineerimisel mitmese pärimise ja operaatorite ülelaadimisega saab lihtsa vahendiga tekitada täiesti loetamatut ja mittehallatavat koodi.

Pakuks, et kui kompilaator genereerib malli asemele funktsiooni, siis võrreldes makrodega on malle kasutav kood siiski aeglasem, sest funktsiooni väljakutse võtab aega. Seda muidugi juhul, kui kompilaator seda funktsiooni välja ei optimeeri.

1. Mittehallatavat koodi saab tekitada igasuguste vahenditega, ja loll on see kes vabandust ei leia. Mina nt olen säästnud mallide, pärimise ja operaatoride ülelaadimise kasutamisega nädalaid ja kuid aega.
2. Praegu eksisteerivad kompilaatorid optimiseerivad üldiselt väga hästi. Artiklis toodud näidet 'max' ei kutsuta välja, vaid see 'inline'-takse hoopis. Ja pealegi, tänapäeva protsessorite kiiruse tõttu maksab arenduse aeg rohkem kui arvuti arvutamise aeg - kes kiiremini valmis saab, on lihtsalt rikkam. Mallid võimaldavad kiiremini arendada.
--matik 19:20, 21 Sep 2004 (UTC)
Kui Sa oled mitmese pärimise ja operaatorite ülelaadimisega ohtralt aega säästnud, siis on ju tore. Kuigi mina eelistaksin artiklis natuke vähem kategoorilist formuleeringut. See, kas kompilaator funktsiooni väljakutseid (vaikimisi) välja optimeerib, sõltub juba konkreetsest kompilaatorist. Igal juhul tuleks seda aga artiklis mainida, praegu on seal minu arust vastuolu. Priitp 10:26, 22 Sep 2004 (UTC)
Kui sa näed kuskil vastuolu, ole hea, ja paranda ära ;) --matik 19:08, 22 Sep 2004 (UTC)

Mallid ei ole ainult C++'ile omased asjad! Näiteks D keel omab malle (vt http://www.digitalmars.com/d/template.html) Peep 28. august 2005, kell 15.57 (UTC)


Soovitaksin plussidest ja miinustest eemaldada punkti "kui mõlemad makro argumendid on lvalue'd (e. sellise tüübiga, mida sobib paigutada omistamisoperaatorist vasakule poole), saab teha nii" koos koodinäitega. Esiteks on kood vigane (kui parandada muutujate nimed): nähtavasti kuna operaatoril ?: peavad mõlemad tulemused olema sama tüüpi, aga siin on operandid eri tüüpi (int& ja long&), siis peab toimuma cast (tõenäoliselt long-iks), aga cast-i tulemus ei ole enam lvalue. Seega kood mis töötaks, näeks välja nii:

void f(int& a, int& b) {
  max(a, b) = 42;
}

Aga see ei ole makrole eriomane. Töötaks ka antud funktsioonimall:

void f(int& a, int& b) {
  max<int&>(a, b) = 42;
}
Siit võeti midagi välja. Andres 9. märts 2010, kell 08:37 (UTC)