infoarena

infoarena - concursuri, probleme, evaluator, articole => Articole => Subiect creat de: Stefan Istrate din Februarie 20, 2009, 01:47:45



Titlul: 12 ponturi pentru programatorii C/C++
Scris de: Stefan Istrate din Februarie 20, 2009, 01:47:45
Comentarii la articolul 12 ponturi pentru programatorii C/C++ (http://infoarena.ro/12-ponturi-pentru-programatorii-cc)


Titlul: scanf/printf vs. cin/cout
Scris de: Nicodei Eduard din Martie 31, 2009, 11:06:07
Vad ca asta este o problema destul de veche: "ce e mai bine sa folosim? functiile scanf/printf din C sau fstream-uri din C++ ?"
Inainte credeam ca sunt mai rapide cele din C si se pare ca aceasta este parerea multora. Am vazut acum insa, ca la problema maxsecv obtin timpi mai mici de executie folosind un ifstream (http://infoarena.ro/job_detail/292444) decat cu scanf (http://infoarena.ro/job_detail/292570).
Pe de alta parte, la problema tije, este mai rapid printf (http://infoarena.ro/job_detail/292561) decat ofstream (http://infoarena.ro/job_detail/292558).

Asta ar insemna ca atunci cand sunt multe date, citirea trebuie facuta cu un ifstream, iar afisarea cu printf.


Titlul: Răspuns: 12 ponturi pentru programatorii C/C++
Scris de: Sima Cotizo din Martie 31, 2009, 12:34:08
In G++ 4 au devenit streamurile ceva mai rapide, dar cred ca tot parsarea ramane sfanta :D

Pe de alta parte, functiile de i/o din cstdio genereaza warninguri multe, deci e mai comod sa folosesti streamuri. (stie cineva vreun flag pentru compilator ca sa ignore acele warninguri, in afara de "-w" care le scoate pe toate?  :?)


Titlul: Răspuns: 12 ponturi pentru programatorii C/C++
Scris de: Tataranu Vlad din Aprilie 02, 2009, 17:10:28
In G++ 4 au devenit streamurile ceva mai rapide, dar cred ca tot parsarea ramane sfanta :D

Pe de alta parte, functiile de i/o din cstdio genereaza warninguri multe, deci e mai comod sa folosesti streamuri. (stie cineva vreun flag pentru compilator ca sa ignore acele warninguri, in afara de "-w" care le scoate pe toate?  :?)

In GCC -Wno-unused-value scoate warningurile alea de care zici tu.
Edit: daca compilezi cu optimizari (-Ox) pare sa ignore -Wno-unused-value, n-am idee de ce :?


Titlul: Răspuns: 12 ponturi pentru programatorii C/C++
Scris de: Vlad Razvan din Noiembrie 30, 2009, 15:00:04
In cazul pontului #3, imbunatatirea vine din cauza prefetch-ului pe care il facea procesorul(mai putin probabil)(prefetch-ul de date e mai putin uzual, ci cel de cod) sau din cauza modului de acces linear la memorie in a 2-a varianta care presupunea un calcul mai simplu al adresei urmatorului element(incrementarea adresei dintr-un registru de adrese al procesorului, in loc de un calcul mai complicat repornind de la adresa de baza a tabloului cum era in cazul in care se facea parcurgerea pe coloane si nu pe linii); daca compilatorul e suficient de destept si cand se trece de la la t[ i ][ j ] la t[ i+1 ][ j ],, modificarea registrului de adrese poate presupune doar adaugarea unui offset; dar offsetul nu 1, deci trebuie pastrat intr-un registru, deci depinde si de capabilitatile CPU-ului, nr-ul de registrii disponibili etc.


Titlul: Răspuns: 12 ponturi pentru programatorii C/C++
Scris de: Marius Stroe din Decembrie 02, 2009, 22:05:50
@drrzvn  Interesant de știut!  :thumbup:


Titlul: Răspuns: 12 ponturi pentru programatorii C/C++
Scris de: A Cosmina - vechi din Decembrie 29, 2009, 16:23:50
Stiu ca nu a mai scris nimeni de mult, dar am si eu o intrebare, poate raspunsul va fi util si celorlalti. :)

La pontul #2 :  eu am auzit ca macro-urile sunt mai rapide decat functiile si sunt mai bune. E adevarat ? Si de ce s-ar incurca in ele ?

A doua chestie care ma nelamureste ... E mai bine sa folosesc goto sau continue cand vreau sa "sar" ?


Titlul: Răspuns: 12 ponturi pentru programatorii C/C++
Scris de: Mircea Dima din Ianuarie 08, 2010, 21:08:49
Stiu ca nu a mai scris nimeni de mult, dar am si eu o intrebare, poate raspunsul va fi util si celorlalti. :)

La pontul #2 :  eu am auzit ca macro-urile sunt mai rapide decat functiile si sunt mai bune. E adevarat ? Si de ce s-ar incurca in ele ?

A doua chestie care ma nelamureste ... E mai bine sa folosesc goto sau continue cand vreau sa "sar" ?


Sunt preferabile functiile inline decat macrourile.
uite de ce te pot incurca:

#define sqr(x) ((x) * (x))

int a = 2;
int c = sqr(++a);

compilatorul va transforma in

int c = (++a) * (++a) ; ... se incrementeaza de 2 ori...

Continue e bun pt a sari.... goto cred ca e depricated (dar e ok)


Titlul: Răspuns: 12 ponturi pentru programatorii C/C++
Scris de: Paul-Dan Baltescu din Ianuarie 08, 2010, 22:38:50
In plus, daca ai ceva de genul
Cod:
#define min(a,b) ((a) < (b) ? (a) : (b))
...
min(f(), g())
atunci functiile f si g se apeleaza de doua ori. In plus, daca cu functiile acestea modifici variabile, acestea se modifica de doua ori si pot propagana probleme serioase in tot programul. Iar daca folosesti bucata de cod de mai sus intr-o functie de tip divide et impera, complexitatea timp creste.

Eu nu sunt neaparat impotriva folosirii define-urilor, dar trebuie sa le stapanesti bine inainte sa le utilizezi.


Titlul: Răspuns: 12 ponturi pentru programatorii C/C++
Scris de: Pripoae Teodor Anton din Ianuarie 09, 2010, 00:59:28
Cod:
#define min(x,y)    (((aux1=x) > (aux2=y)) ? aux1 : aux2)


Titlul: Răspuns: 12 ponturi pentru programatorii C/C++
Scris de: Andrei Grigorean din Ianuarie 09, 2010, 01:56:26
Eu personal am renuntat de ani buni la macrouri, chiar si pentru constante folosesc const int. In afara de presupusa viteza mai mare de rulare, nu vad niciun avantaj fata de functiile inline.


Titlul: Răspuns: 12 ponturi pentru programatorii C/C++
Scris de: A Cosmina - vechi din Ianuarie 09, 2010, 08:51:01
Multumesc pentru raspunsuri, m-am lamurit acum. :)


Titlul: Răspuns: 12 ponturi pentru programatorii C/C++
Scris de: Sima Cotizo din Ianuarie 09, 2010, 10:46:03
Cod:
#define min(x,y)    (((aux1=x) > (aux2=y)) ? aux1 : aux2)

Trebuie sa declari aux1 si aux2... prea multa bataie de cap, mai bine un inline :)


Titlul: Răspuns: 12 ponturi pentru programatorii C/C++
Scris de: Stefanescu Alexandru Marian din Februarie 04, 2010, 02:16:37
chestia cu bc pt calcularea unei puteri mari ,imi puteti spune si mie cum se foloseste ,dar pe inteles de clasa a 9-a


Titlul: Răspuns: 12 ponturi pentru programatorii C/C++
Scris de: Pripoae Teodor Anton din Februarie 04, 2010, 14:29:43
Daca ai linux, scrii "bc" in terminal, si o sa ti se deschida un program in care o sa poti face calcule. E un fel de calculator ca cel de pe windows doar ca fara interfata grafica, fiind mult mai rapid.


Titlul: Răspuns: 12 ponturi pentru programatorii C/C++
Scris de: Balan Catalin din Aprilie 02, 2010, 19:37:51
Cum se poate afla in windows memoria folosita de program? In linux ma folosesc frumos de time, ca stie si asta (sincer nu stiu exact parametrii... ii dau -v (verbose-u default) si acolo stiu ce caut), dar in windows n-am nici o idee cum se face (in cazul in care sunt la concursuri inainte de ONI si se intampla sa am restrictii de memorie).

Observatie pentru cei care nu stiau ca time iti da si memoria - in Ubuntu (nu stiu daca si in alte distributii) programul time original este mutat in /usr/bin/ si ce se acceseaza simplu cu time nu permite alte optiuni (precum -v). In loc de time folositi:

Cod:
/usr/bin/time -v program


Titlul: Răspuns: 12 ponturi pentru programatorii C/C++
Scris de: alexandru din Aprilie 03, 2010, 17:04:07
Poti folosi cygwin, dar ma indoiesc ca la un concurs il pune la dispozitie. Ori faci calcule de mana ( estimezi pe cel mai rau caz cat ar consuma ) ori iti faci un program pentru asa ceva  read this  (http://msdn.microsoft.com/en-us/library/ms683219(v=VS.85).aspx)  :)


Titlul: Răspuns: 12 ponturi pentru programatorii C/C++
Scris de: Alpaca Gedit din Martie 17, 2014, 19:18:50
Ce sunt macro-urile?
Multumes  :ok:  :banana: :banana: :banana: :banana: :banana:


Titlul: Răspuns: 12 ponturi pentru programatorii C/C++
Scris de: Eftime Andrei Horatiu din Aprilie 24, 2014, 21:27:27
Un drum pe wikipedia rezolva tot.....
http://en.wikipedia.org/wiki/Macro_(computer_science) (http://en.wikipedia.org/wiki/Macro_(computer_science))


Titlul: Răspuns: 12 ponturi pentru programatorii C/C++
Scris de: Petru Trimbitas din Septembrie 24, 2014, 23:48:01
9b mi se pare o prostie si consider ca ar trebui sters din articol. Vad o gramda de programatori care folosesc acest "smen" si nu vad de ce e mai bun decat (1<<29) sau (1<<30).


Titlul: Răspuns: 12 ponturi pentru programatorii C/C++
Scris de: George Marcus din Septembrie 25, 2014, 01:07:37
Singurul avantaj e ca merge combinat cu memset(). Dar putem folosi fill(), deci e cam inutila chestia.


Titlul: Răspuns: 12 ponturi pentru programatorii C/C++
Scris de: Dragos-Alin Rotaru din Septembrie 25, 2014, 10:16:46
Eu am pierdut o data 50 de puncte la o problema pt ca am pus cu un 3f mai putin. :)
Good practice e sa nu va obfuscati codul atunci cand nu e nevoie.


Titlul: Răspuns: 12 ponturi pentru programatorii C/C++
Scris de: Mihai Calancea din Septembrie 25, 2014, 13:43:25
Da, nu recomand nici eu infinitul respectiv. (1 << 30) nu e bun fiindcă nu acoperă tot int-ul.
Probabil cel mai bine e să folosiți http://www.cplusplus.com/reference/limits/numeric_limits/.


Titlul: Răspuns: 12 ponturi pentru programatorii C/C++
Scris de: George Marcus din Septembrie 25, 2014, 14:01:56
Nu vad care e problema daca nu acoperi tot int-ul. Si daca folosesti std::numeric_limits<int>::max() risti sa faci overflow in unele cazuri.


Titlul: Răspuns: 12 ponturi pentru programatorii C/C++
Scris de: Mihai Calancea din Septembrie 25, 2014, 14:13:56
Nu știu de ce, dar mă gândeam la valori potrivite cu care să inițializezi minime, nu la infinituri în general. În fine, chestiile astea nu prea se pot trata complet independent de contextul problemei. Cel mai bine e să-ți între în reflex ce faci în fiecare caz, nu să ai constantele pregătite în template.


Titlul: Răspuns: 12 ponturi pentru programatorii C/C++
Scris de: Andrei Grigorean din Septembrie 27, 2014, 19:37:15
9b mi se pare o prostie si consider ca ar trebui sters din articol. Vad o gramda de programatori care folosesc acest "smen" si nu vad de ce e mai bun decat (1<<29) sau (1<<30).

Pentru ca poti sa faci memset si nu da overflow.


Titlul: Răspuns: 12 ponturi pentru programatorii C/C++
Scris de: Adrian Budau din Octombrie 09, 2014, 09:55:34
@George Marcus. Eu folosesc numeric_limits<int>::max() aproape intotdeauna, mai putin cand adun si cred ca o sa-mi dea overflow. Atunci pun numeric_limits<int>::max() / 2. Si gata, s-a rezolvat problema :-)