Page 4 of 10

Re: cod naspa

Posted: 15 Feb 2010, 01:04
by Silviu Ardelean
Ovidiu Cucu wrote:Mai pe inteles: se cheama "fortat" un constructor si-un destructor care nu se apeleaza in nici un scenariu.
Faza asta mi-a adus aminte de-o gaselnita prin cod, mult mai tare... Cateva din clasele modulului respectiv aruncau exceptii in destructor. :wth:
Nu ai idee ce aere de vedeta aveau colegii respectivi, ce lucrasera anterior pe acel proiect. Am avut mai multe "meciuri" cu ei. Din pacate, la momentul respectiv ei erau mai apreciati decat mine ptr. simpul fapt ca erau "veterani". Timpul a facut dreptate. :)

Re: cod naspa

Posted: 15 Feb 2010, 11:33
by cristianamarie
Silviu Ardelean wrote:Cateva din clasele modulului respectiv aruncau exceptii in destructor.
Ecscelent. Imi permit si eu un link: Google C++ Style Guide -Exceptions
Exceptions
▶ We do not use C++ exceptions.

Re: cod naspa

Posted: 15 Feb 2010, 11:39
by Dragos Cojocari
cristianamarie wrote:
Silviu Ardelean wrote:Cateva din clasele modulului respectiv aruncau exceptii in destructor.
Ecscelent. Imi permit si eu un link: Google C++ Style Guide -Exceptions
Exceptions
▶ We do not use C++ exceptions.
Google e un fel de Chuck Norris al soft-ului. "Google does not use C++ exceptions, C++ exceptions search Google to fix themselves". : flex :

O fi Google mare si tare dar asta nu inseamna ca tot ce merge la ei merge peste tot sau e bun peste tot. Mai bine ne uitam ce zic batranii: http://www2.research.att.com/~bs/bs_faq ... ptions-why

Re: cod naspa

Posted: 15 Feb 2010, 11:55
by cristianamarie
Si asta e drept. Dar voiam sa subliniez pragmatismul.
Edit: Si alta parere Cleaner, more elegant, and harder to recognize.

Evident, throw in destructor nu e greu de vazut ca e prost :D

Re: cod naspa

Posted: 15 Feb 2010, 12:04
by Dragos Cojocari
cristianamarie wrote:Si asta e drept. Dar voiam sa subliniez pragmatismul.
Eu nu voiam sa contest modul in care foloseste Google limbajul C++ ci doar sa remarc ca ceea ce e bun ptr ei( a se citi o roganizatie imensa cu proiecte foarte mari si o anumita filozofied de dezvoltare/sales) nu e neaparat bun si eficient ptr oricine.

Re: cod naspa

Posted: 15 Feb 2010, 22:05
by Ovidiu Cucu
Ecscelent. Imi permit si eu un link: Google C++ Style Guide -Exceptions
Exceptions
▶ We do not use C++ exceptions.
Mare-i gradina ta, Stroustrup,... dar prea multi i-au sarit gardul!

[ later edit ]
Inca una de la gugle:
  • Use sizeof(varname) instead of sizeof(type) whenever possible
Use sizeof(varname) because it will update appropriately if the type of the variable changes. sizeof(type) may make sense in some cases, but should generally be avoided because it can fall out of sync if the variable's type changes.
Ugh!!! :wacko:
Sublinierea imi apartine si... copii, arhitecti, designeri,... nu schimbati tipul variabilei acasa! :D ;).

Re: cod naspa

Posted: 15 Feb 2010, 22:39
by Silviu Ardelean
In legatura cu sizeof() eu sunt de acord.
Chiar mi se pare o idee foarte ok. Sunt situatii in care poti sa o musti daca pasezi tipul ca parametru si uiti sa-l schimbi, cand se schimba tipul variabilei. Cred ca e un tips and tricks din categoria "writing solid code".

Re: cod naspa

Posted: 16 Feb 2010, 12:36
by Ovidiu Cucu
Eu preferam sizeof(type) in loc de sizeof(variable) mai mult pentru readability, chestie la care tin destul de mult.
Dar cred ca au si ei dreptate: intradevar sizeof(variable) e ceva mai defensiv (mai ales pentru "uituci" :D ;)).

Insa, cu "No C++ exceptions!" nu sunt de acord. Am vazut mult cod respectand acest principiu as a rule.
Nu sunt sigur daca la capitolul eliminare overhead se castiga atat de mult incat sa merite.
O fi... de la caz la caz.
In schimb, sigur-sigur codul care foloseste exceptii C++ ii da clasa la complexitate, mentenanta si citibilitate.
Bineinteles, daca exceptiile sunt tratate asa cum trebuie, si nu ca de exemplu:

Code: Select all

    try
    {
        // ...
    }
    catch(...)
    {
        printf("Exception occurred!!!");
        exit(-1);
    }
}
// I do hate catch(...)!

Re: cod naspa

Posted: 16 Feb 2010, 13:07
by Ovidiu Cucu
Ca veni vorba de sizeof...

Q: E ceva nashpa in codul de mai jos?

Code: Select all

    size_t size = sizeof(v++);

Re: cod naspa

Posted: 16 Feb 2010, 13:17
by Silviu Ardelean
Ovidiu, nu e vorba de uituci. Trebuie sa privesti si altfel lucrurile.
Poate ca, codul acelei solutii e unul foarte mare si complexitatea e pe masura. Acest cod ajunge sa fie modificat de multa lume, unii chiar care nu existau in firma la ora scrierii initiale a codului cu sizeof(type).
Ei bine, acestia in urma unei decizi majore din cadrul echipei decid ca e au nevoie sa schimbe tipul unor obiecte, chiar daca clasele tipurilor vechi inca exista. Atunci, se poate ajunge la overflow-uri deloc placute si destul de dificil de observat.
Dau si eu un exemplu banal.

Code: Select all

class C1
{
  public:
   C1() {}
   ~C1() {}

  doSomething() { cout<< "to do"; };

  int x;
   int y;
}

// pe undeva prin cod avem un obiect al clasei ce 1 si facem un memset() pe el - poate nu ceea mai inspirata idee
C1 ob;
....
 ob.DoSomething();
....
memset(&ob, 0, sizeof(C1));
....
Numai ca la un moment dat, e creeata o noua clasa C2.

Code: Select all

class C2
{
 public:
   C2() {}
   ~C2() {}
   doSomething() { cout<< "to do"; };
  int x;
   int y;
   std::wstring name;
}

// daca userul uita sa schimbe clasa in memset() am pus-o de un overflow
C2 ob;
....
  ob.DoSomething();
....
memset(&ob, 0, sizeof(C1));
....
Deci, mai safe ar fi sa pune sizeof(ob).

Re: cod naspa

Posted: 16 Feb 2010, 13:19
by Silviu Ardelean
Ovidiu Cucu wrote:Ca veni vorba de sizeof...

Q: E ceva nashpa in codul de mai jos?

Code: Select all

    size_t size = sizeof(v++);
De ce tip e v? Nu de altceva, dar nu se complieaza.

Re: cod naspa

Posted: 16 Feb 2010, 13:29
by Ovidiu Cucu
Silviu Ardelean wrote:
Ovidiu Cucu wrote:Ca veni vorba de sizeof...

Q: E ceva nashpa in codul de mai jos?

Code: Select all

    size_t size = sizeof(v++);
De ce tip e v? ...
Sa zicem, int.

Re: cod naspa

Posted: 16 Feb 2010, 13:35
by Silviu Ardelean
Cred ca nu mi-e adresata mie intrebarea. Pe Win32/Win64 variabila size va fi 4 (indiferent de operatorul aplicat asupra variabilei v).

Re: cod naspa

Posted: 16 Feb 2010, 13:55
by Ovidiu Cucu
Hai s-o "complicam" putin!

Code: Select all

    int v = 0;
    while(v < sizeof(v++))
    {
        // do something
    }
Still OK? :)

Re: cod naspa

Posted: 16 Feb 2010, 13:57
by cristianamarie
Mai sint si treburile cu structuri variabile, unde vezi chestii gen struc.cbSize = SIZEOF_STRUCT_V1; sau treburi din astea. Acolo chiar ca e bija.