kerdesek
hoyuka hoya
hoyuka at c2.hu
Thu Sep 1 14:01:36 CEST 2005
Szia!
Ehhez a C ganyolas/nem ganyolas dologhoz szeretnek kicsit hozzaszolni.
Szerintem jo dolog, hogy ilyeneket megenged a C, mert:
- C egy gepfuggetlen assembly nyelvnek keszult
- C-ben kerneleket szoktak irni
- C-ben szoktak olyan eszkozokre fejleszteni, ahhol keves eroforras all
rendelkezesre
pl. vizsgaljuk meg ezt a structuras megoldast:
1. legyen az altalad preferalt modszer, a char *data;
(a konzekvenzia miatt maradjunk a lofasz-nal :))
typedef struct Lofasz {
int size;
char *data;
} Lofasz;
ennek a structuranak a helyfoglalasa, 32 bites architektura es 64 bajtos
adatmezo eseten:
sizeof(Lofasz)=8bajt
sizeof(64*sizeof(char))=64bajt
Ez eddig 72 bajt, plusz meg az az adatmennyiseg, amit a malloc() csap
hozza a belso nyilvantartasa erdekeben (ezt olyan 8 bajtra tippelem). Es
ez ketszer (16bajt), mert kulon le kell foglalni a helyet a strukturanak
es az adatmezonek.
Igaz, ezt a strukturat stack-en is letre lehet hozni, igy nincs +
jarulekos memoria veszteseg a malloc() miatt.
tehat az osszes helyfoglalas:
8+64+16=88 bajt.
a masik modszer:
typedef struct Lofasz {
int size;
char data[0];
}
sizeof(Lofasz)=4 bajt;
sizeof(64*sizeof(char))=64bajt
A strukturat egyszer kell allokalni, az ezzel jaro jarulekos memoria
legyen kb. 8 bajt;
szumma=4+64+8=76
Kulonbsegek vannak az adatszerkezetek kezeleseben is, ez a masodik modszer
szerintem gyorsabb es kevesebb kodot igenyel.
Engem is megkoveznenek a melohelyen, ha ilyeneket csinalnek, de itt mas a
felallas, nem eroforras szegeny eszkozokre fejlesztunk.
Sok programozo maglyan egetne el a goto hasznalokat valami divatlaz miatt.
Pedig engem az ilyenek egyaltalan nem zavarnak:
bool openResource() {
if (!openResourceA()) goto err0;
if (!openResourceB()) goto err1;
if (openResourceC()) return true;
freeResourceA();
err1:
freeResourceB();
err0:
freeResourceC();
return false;
}
Masik alkalmazasi pelda az egymasba agyazott ciklusokbol valo kilepes
lenne, de erre nincs kedvem peldat irni.
Szal az en velemenyem az, hogy az "ertelmes" C-es ganyolas bizonyos
esetekben helyenvalo (bar ennek a megitelese szubjektiv dolog). Ha valaki
nem akar bizonyos dolgokat latni a projektjeben, akkor csinaljon coding
guideline-t es/vagy hasznaljon mas nyelvet.
Masik meglatasom, hogy "ganyolassal" is lehet nagyon szepen felepitett,
konnyen megertheto es jol karbantarthato progit irni es JAVA-ban is lehet
nagyon nagy ocsmanysagokat csinalni. Pl. lattam olyan ember kodjat, aki
JAVA-ban tudot programozni csak (OOP nyelvek kozzul) es iszonyat
atlathatatlan gany volt amit csinalt. Jo, nem lesznek benne memory
leak-ek, nem fog segfault-ozni, de ha modositok egy class-ban egy member
class-t, akkor az isten sem fogja tudni megmondani, hogy melyik masik 800
class fogja helytelenul a modositott peldanyt latni es melyik az a 3
class ezzek kozzul, akinek privat peldany kell az adott class-bol.
udv.
hoyuka
Valenta Ferenc said:
> hoyuka hoya wrote:
>
>> En arra tippelek, hogy lehet nem erted mi ez a 0 elemu tomb. Ez
>
> Igy van. De a forditok sem mindig.
>
>> gyakorlatilag semmi, nincs helyfoglalasa, a structura allokaciojanal dol
>> el, hogy mekkora lesz a tomb merete (malloc). Jo ez kicsit ganyolos, de
>> a
>> C amugyis egy nagyon ganyolos nyelv pl. a kifinomult C++ vagy JAVA
>> programozashoz kepest.
>
> Ez igen nagy ganyolas!! A C alapbol nem ilyen, csak lehetoseget ad
> ilyesmire is. Sohasem szerettem, az teny.
> Komolyan, ha itt jo lenne az info[], nem szolnek egy szot sem, de az
> info[0] kicsit durva.
>
>> Miert gondolod, hogy nem tanitottak a kod irojanak pointereket? Eleve
>> ilyen strukturat csak malloc-al erdemes letrehozni, ami eleve pointeres
>> dolog.
>
> Nem, tiszta statikus az egesz, nincs benne malloc.
> Legalabbis nem hapogott hogy nincs heap szegmens.
>
>> uint8_t *info != uint8_t info[0] !!!!
>
> Viszont char *info == char info[]
>
>> Az uint8_t *info 4 bajtot foglal a structurabol (32bites pointerek
>> eseten), a uint8_t info[0] meg semmit.
>
> Az eredeti progiban gyakorlatilag egy sima castolast csinal, csak
> nem kell minden hivatkozaskor megadni, hanem benne van a typedef-ben.
> Lehetett volna mashogy is csinalni, de igy csinaltak, inkompatibilitast
> okozva, gannya teve a kodot. Attol fuggetlenul, hogy mukodhet, az ilyen
> programozonak siman letornem a kezet.
> En nem is csinalhatok ilyet a melohelyen, az 1000 oldalas :) coding
> guideline tiltja a kokanyolast.
>
>> hoyuka
>
> --
> Valenta Ferenc <ferenc.valenta at vhl.hu> Volcano/Mentor Graphics
> "My love is REAL, unless declared INTEGER"
>
>
> -----------------------------------
> Szponzorunk: http://tonerbolt.hu/
>
-------------------------------------
C2 MAIL: A nagy levelez-Õ. http://mail.c2.hu
More information about the Elektro
mailing list