Hogy lehet kiszámolni c-ben hogy pl egy struktúra mennyi helyet foglal?
#10 Látom még mindig csak a copy paste megy.
Magadat próbálod intelligensebbnek beállítani azzal, hogy forrásmegjelölés nélkül copy paste-elsz dolgokat, amikről gőzöd sincs, vagy csak elfogadtad, hogy képtelen vagy saját kútfőből bármit megválaszolni? Mindkét esetben gratulálok.
Egyébként a forrás amit bemmásoltál pont a te 'érvelésed' cáfolja meg. A sizeof a struct *valódi* méretét adja vissza, a fordító optimalizálásából keletkező lyukakkal együtt. Úgyhogy ehhez is gratulálok.
"A sizeof a struct *valódi* méretét adja vissza,"
Hát nem. A sizeof a struct foglalási méretét adja vissza, ami vagy azonos a struct valódi méretével, vagy nem.
Sajnos azt kell mondanom, hogy neked semmi közöd ehhez a foglalkozáshoz.
A képzelt "mattod"-ban levő extrém stupid tévedések, a jelenlegi vergődésed, mind azt mutatják, hogy erre a pályára alkalmatlan vagy.
Ráadásul, te engem ellenfélként kezelsz, holott, én nem azért járok ide, hanem kikapcsolódni, lazítani. De ha mégis, azt kell mondanom, hogy te számomra nem jelentenél kihívást.
Amit idéztem, az igenis engem igazol, csak olvasd el az első beírásomat és ha nem operálták ki az agyadat, akkor be is fogod látni.
A kérdésre a legpontosabb választ az írta meg, aki rámutatott, fordító paraméterezés, valamint architektúra függvénye a dolog.
Négy plusz egy byte az öt byte és nem nyolc, de ha eleve a speed a lényeg, akkor egy PC-n, 32 bites rendszeren nyilván 32 bit szélességen tárol a fordító nem csak char-t de még boole* értéket is. Azért, mert a gépi szó hossza a leggyorsabb és mert a memóriaszervezés is eleve 32 bites. Most mit számít ilyen közegben plusz 3 byte? Semmit.
* nyelvtől totál függetlenül.
Ha meg egy 8 bites mikrokontroller, vagy CPU a target, akkor nyilván számít a plusz 3 byte, adott esetben még bitek is és amúgy is, ott byte-os szervezésű a memória, oprendszer jellemzően nincs, tehát a fordító ott már nem fogja 32 bitre kihúzni az annál /tehát 32 bitnél/ kisebb változó-tipusokat, mert számít sokszor még két byte is. Nagyon számít. A Z80-on pl. ezért van bitenkénti címzés is, proletár.
Én meg #11-en kívül. De hát ez ilyen, ha az emberek értelmes dolgokat írnak, és nem lógnak ki a tömegből a 0%-ot verdeső értékeléseivel.
Emlékeztetnélek a kérdésre, kedves #12-es. "Hogy lehet kiszámolni, hogy egy struktúra mennyi helyet foglal". Azaz, mennyi a tényleges foglalása a memóriában. Ennek ellenére te még mindig arról papolsz, hogy a struktúra mérete hogyan egyenlő az elemei méretének összegével. Nem egyenlő. A struktúra mérete annyi, amennyi helyet az a memóriában foglal. Az a *valódi* mérete. És annak a meghatározására irányul a kérdés. Van még kérdés?
"Ennek ellenére te még mindig arról papolsz, hogy a struktúra mérete hogyan egyenlő az elemei méretének összegével. Nem egyenlő. A struktúra mérete annyi, amennyi helyet az a memóriában foglal. Az a *valódi* mérete. És annak a meghatározására irányul a kérdés."
Ez baromság. A valódi mérete? Ne nevettess.
Írass ki egy struktúrát, vagy uniont file-ba és ott lesz a valódi mérete. Azt sem tudod miről firkálsz.
Eleve, már a kérdés furcsa, mert nem tudni pontosan, hogy mire irányul.
Ha a kérdező csak tudni szeretne, akkor oké. De ha alkalmazni szeretné a szerzett ismereteket, akkor már nem egyértelmű, mert a struct-ot nem szerencsés csomagolni, csak néhány nagyon speciális esetben, mert ami jön a réven annak duplája megy el a vámon.
Az lenne a menü, hogy a megadott literálok hiába int-ek, elférnek egy-egy byte-on, azaz, a három integer értéket tárolhatjuk egy integer helyén. Ezzel nyerünk. De mit? Lóf.szt. Amennyire mindennapos volt ez a kilencvenes, na meg, gondolom a nyolcvanas években, annyira tökönlövés manapság. PC-s környezetben egyszerűen nem éri meg. Helyet nem takarítunk meg, de a dolognak költsége van.
Arról nem beszélve, hogy a fordító igény szerint paraméterezhető, tehát ami eredendően 4+1 byte space-t foglal, az foglalhat 4+4 byte space-t is. Ilyenkor mi van nyomi? Válaszolj, mekkora is lesz a 'valódi' mérete ugyanannak a struct-nak?
Nem igazán polgárpukkasztás, van egy két mekeseredett marharépa, aki a sikertelenségét azzal kompenzálná, hogy minden kérdéshez beböfög valami marhaságot.
Visszatérve a témára, nem lehet kiszámolni előre, mert tudnok kell az architectúrát, de főleg a compiler tulajdonságaut és beállításait. (amit mégis ki tart számon?!) Általnosságban az mondható el, hogy a C nyelv tiltja, hogy a sturctura kisebb legyen, mint az elemek méretének összege. Ehhez sokszor (de nem kötelezően) a compiler még hozzáad egy paddinget, jellemzően 4-el osztható bájtra paddingol.
Miért lett neked akkor most 4 bájt? Mert un. bit fieldeket használtál. Ha azt írod "int a:2;" ezzel szó szerint azt mondod, hogy tárold két biten azt az adatot, lesz ami lesz. Ha ezeket összeadjuk, akkor neked 9bit jön ki. Namost tudjuk, hogy a memóriában 1 bájt a legkisebb megcímezhető egység, ami 8 bit. Tehát 9 bithez min. 2 bájt kell. Viszont mivel a compilered paddingolt, ezért hozzáadott még 2 bájtot, hogy kijöjjön 4re, mert az a legközelebbi 4el osztható szám.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!