cod naspa

Acest forum este dedicat intrebarilor de programare care nu-si au locul in unul din celelalte forumuri
User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: cod naspa

Post by Silviu Ardelean » 15 Feb 2010, 01:04

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. :)



User avatar
cristianamarie
Membru++
Membru++
Posts: 480
Joined: 12 Mar 2009, 18:47
Judet: Iaşi
Location: Iasi

Re: cod naspa

Post by cristianamarie » 15 Feb 2010, 11:33

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.
Nuclear launch detected

Dragos Cojocari
Membru++
Membru++
Posts: 789
Joined: 11 Jul 2007, 14:11

Re: cod naspa

Post by Dragos Cojocari » 15 Feb 2010, 11:39

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
Last edited by Dragos Cojocari on 15 Feb 2010, 11:40, edited 1 time in total.
Reason: typo

User avatar
cristianamarie
Membru++
Membru++
Posts: 480
Joined: 12 Mar 2009, 18:47
Judet: Iaşi
Location: Iasi

Re: cod naspa

Post by cristianamarie » 15 Feb 2010, 11:55

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
Nuclear launch detected

Dragos Cojocari
Membru++
Membru++
Posts: 789
Joined: 11 Jul 2007, 14:11

Re: cod naspa

Post by Dragos Cojocari » 15 Feb 2010, 12:04

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.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: cod naspa

Post by Ovidiu Cucu » 15 Feb 2010, 22:05

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 ;).

User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: cod naspa

Post by Silviu Ardelean » 15 Feb 2010, 22:39

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".

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: cod naspa

Post by Ovidiu Cucu » 16 Feb 2010, 12:36

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(...)!

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: cod naspa

Post by Ovidiu Cucu » 16 Feb 2010, 13:07

Ca veni vorba de sizeof...

Q: E ceva nashpa in codul de mai jos?

Code: Select all

    size_t size = sizeof(v++);

User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: cod naspa

Post by Silviu Ardelean » 16 Feb 2010, 13:17

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).

User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: cod naspa

Post by Silviu Ardelean » 16 Feb 2010, 13:19

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.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: cod naspa

Post by Ovidiu Cucu » 16 Feb 2010, 13:29

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.

User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: cod naspa

Post by Silviu Ardelean » 16 Feb 2010, 13:35

Cred ca nu mi-e adresata mie intrebarea. Pe Win32/Win64 variabila size va fi 4 (indiferent de operatorul aplicat asupra variabilei v).

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: cod naspa

Post by Ovidiu Cucu » 16 Feb 2010, 13:55

Hai s-o "complicam" putin!

Code: Select all

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

User avatar
cristianamarie
Membru++
Membru++
Posts: 480
Joined: 12 Mar 2009, 18:47
Judet: Iaşi
Location: Iasi

Re: cod naspa

Post by cristianamarie » 16 Feb 2010, 13:57

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.
Nuclear launch detected

Post Reply