[pso] [tema1] syscall_arg[0]

Lucian Adrian Grijincu lucian.grijincu at gmail.com
Thu Apr 3 17:46:37 EEST 2008


2008/4/3 Cosmin Ratiu <cosminratiu at gmail.com>:
> In plus, un array de 0 bytes nu ocupa deloc spatiu in structura, in timp ce
> un pointer ar fi ocupat 4 octeti.
>
> Imi pare rau pt 2 mailuri in loc de unul dar mi-a sarit mai tarziu in cap
> motivul asta.
>
> Cosmin.
>
> 2008/4/3 Cosmin Ratiu <cosminratiu at gmail.com>:
>
> > Daca ar fi fost pointer ar fi trebuit sa aloci memoria *separat* pentru
> el. In felul in care e declarat, ca un array de dimensiune 0, iti permite sa
> aloci memoria intr-un singur bloc, care sa contina structura si datele din
> array. E pur si simplu o smecherie ca sa minimizeze fragmentarea memoriei.

Cu alocarea memoriei intr-un singur bloc poți să scapi cu union-uri,
dar e mai urât, pentru că trebuie să îți declari câte un union pentru
fiecare caz.

Scopul e să poți specifica cât mai clar că ai un array de lungime variabilă.

ai mai multe tipuri care au o parte comună identică și o parte de
lungime variabilă.
struct A{
    int teh_common_part;
    char a[100];
}

struct B{
    int teh_common_part;
    char b;
}

struct C{
    int teh_common_part;
    char c[2];
}

struct D{
    int teh_common_part;
    // partea variabilă e aici de lungime nulă
}


și ai o mulțime de funcții care lucrează doar pe partea comună și fac
același lucru indiferent de tipul obiectului.

Mai mult, s-ar putea să nu știi toate tipurile de la început (nu știi
lungimea ultimului câmp).

For reasons of code clarity, GCC (și cl cred) suportă extensia "zero
length array"

struct generic_X{
    int teh_common_part;
    char x[0];
}

sizeof (generic_X.x) e zero, dar:
   struct generic_X * g;
   g->x + n --- va arăta la al n-lea char de după teh_common_part.

Dacă vrei să aloci un obiect de tip specific faci asa:
  struct generic_X * a = malloc(sizeof(struct generic_X) + 100);
  struct generic_X * b = malloc(sizeof(struct generic_X) + 1);
  struct generic_X * c = malloc(sizeof(struct generic_X) + 2);
  struct generic_X * d = malloc(sizeof(struct generic_X)       );


-- 
Lucian


More information about the pso mailing list