Potreboval bych zjistit kolik struktura prave zabira pameti.Chci mit totiz presny prehled o jejich velikosti,jenze sizeof to nedokaze.Nevite jak napsat takovou f-ci,neb jestli nejaka takova existuje?
Dekuji za odpoved
Fórum › C / C++
Náhrada za sizeof
No sizeof akorat zada velikost pri prekladu,pruzne se nemeni(napr u vectoru nebo u allocator).Myslim napr mam string .Prazdny ma velikost 32bytu,jenze i kdyz do nej neco ulozim,sizeof vrati 32.
Omlouvam se ze pisu neprihlaseny,ale nejak se mi nejde prihlasit
Teraz nevim ci myslis string ako c-ckovsky alebo sablonu z C++, ale asi sablonu kedze 32 byte-ov...
Ono ide o to, ze vnutorne je string (ako trieda) vnutrne vyrobena tiez "len" z obycajneho C-ckovskeho retazca a c-ckovsky retazec ja vlastne char * a ten ma _vzdy_ rovnaku velkost (32 (64) bitov na 32 (64) bitovyich procesoroch)... A ten retazec je ulozeny niekde uplne inde v pamati ako instancia tej triedy...
To yaqwsx 2:
Takto zjišťovat velikost STL kontejneru je docela zrážející. STL konetejnery nabízí určité metody, kterými lze velikost(resp. počet položek) dat, které obsahují zjistit. Takže nezbýva než nahlednout do dokumentace a trochu si ji prostudovat.
To Jura:
NO mas pravdu,prave o to mi jde.PRoto bych chtel nejakou f-ci,ktera to dokaze spocitat.Napadlo me nastavit ukazatel na 1. a na posledni byte a pak to spocitat,jenze nevim jak je nastavit
To k: jmenuje size();
TAk, skousim udelat takovy jednoduchy databazovy program,a on pracuje s polozkami,ktere uchovavam v primitivnim datovem poli,vytvorenem pres tidu allocate.To by se zjistenim velikosti nebyl problem,kdyby nebyly nektere polozky dynymicky rostouci,nebo nebyly ruzneho typu(pro pole se tvri stejne,ale pracuji s nimi jinak).Tadle hiearchie mi pak za predpokladu,ze muzu znat presnou delku jednotlivych polozek,umoznuje snadne ukladani a nacitani do/ze souboru.
Mno, vzhledem k tomu, co se snažíš udělat, tak bych asi postupoval trochu jinak(memory mapped files). Teď budu trochu hádat. Pokud ten kontejner ukládáš jako celek,tak to raději nedělej. Vždy ukládaj jednotlivé položky postupně. Ale pokud jde jen o ukladání, tak jak jsem tu kdysi psal, struktury nemá moc smysl načítat/ukladát jako celky, ale po položkách - je to kvůli zarovnání(velikost struktury obvykle bývá větší než je skutečná). Samozřejmě záleží na účelu, někdy je asi vhodnější ukládat jako celek, kvůli rychlosti, ale jak jsem psal, záleží na účelu. Jinak koukni se na serializaci a deserializaci(ukladání a náčítaní). Obvykle se hodí udělat si nějaký interface, který budou implementovat všechny objekty(bude obsahovat jen 2 metody serialize a deserialize) a dále nějakou třídu, která se bude starat o ukládání(další pro načítání). Jinak opět uvedu svůj oblíbený zdroj:
http://relisoft.com/book/tech/7serial.html :) To podstatné je úplně dole.Samozřejmě, aby to bylo úplně ok, tak by to chtělo ještě něco, co bude řešit endianitu.
Nemal by si to jednoduchsie keby urobis pole (alebo hoicio ine) z niecoho ako
struct _data {
int len;
char * data;
}
?
+poprpade nejake ine polozky a "int len" by bola dlzka zanamu a data by si uz interpretoval ako len chces...
Navyse sa takto nemusis srat o to, ze kolko ma v skutocnosti ta struktura koli zarovnavaniam a tak, lebo zpisujes <len> byte-ov z data ...
Ale ak som ta zle pochopil tak ma ignoruj ;)
To Jura:NO,to tema jsem si cetl,bohuzel jsem strukturu navrhoval tak aby,se dala ukladat v celku....A az pak jse si uvedomil,ze neznam nic na zjisteni velikosti...Jeste skusim popremyslet po nejakem jinem zpsobu,a mozna predelam i tu strukturu...
Diky za odpovedi a snahu
to yaqwsx2: este ak mozem poradit. Ked robis taketo veci kedy pracujes z datami a niekde ich zapisujes (ci uz vlastny format, alebo protokol) pouzivaj fakt len najnutnejsie najelementarnejsie typy ala char, int. Ak mozes nepouzivaj ziadne instancie na triedy, popripade ako Jura pisal, implementuj si nejaky mechanizmus serializacie.
Dalsia rada do zivota ;) Uz x-programatorov riesilo tieto problemy. Da sa povedat ze manipulacia z datami a strukturami je gro celeho humbuku z nazvom informatika.Preto uz v 80 rokoch vzniklo nieco co malo umoznit lebsiu pracu zo strukturami. Nazyva sa to ASN.1. Ide skor o abstraktnu vec ale doporucujem nastudovat. ASN.1 funguje uz x-rokov v pozadi a vela sa o tom nepise ale je na tom postavene mnozstvo systemov, protokolov. Clovek sa z nim stretne snad v kazdom odvetvy, na kazdom rohu, ci uz telekomunikacie, siete, bankovy sektor. V ASN.1 som vydel implementovany LDAP, SNMP a mnozstvo inych. Dokonca suborove formaty ako Wav ci Avi. Doporucoval by som ti teda sa pozriet na ASN.1 a jeho konkretne kodovania BER, CER, DER a hlaavne princip TLV. Tym sa mozes inspirovat a tvoj navrh bude podstatne rozumnejsi. Dokonca ked ziskas skusenosti z asn1c tak ti usetry aj mnozstvo kodovania.
http://www.root.cz/clanky/analogie-asn1/
http://lionet.info/asn1c/
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Sizeof bool — založil Porcepoque
Proč sizeof n-prvkového pole vyplivne 4ku? — založil ondrej39
Moderátoři diskuze