Forum » Programiranje » [C++] Class member offset
[C++] Class member offset
zhigatsey ::
Živjo,
Kot vidite v spodnjem primeru za vsakega člana razreda Test izpišem razliko med kazalcem objekta in člana razreda.
Tako dobim nekakšen odmik vsakega člana razreda. Ideja je ta da bi na podlagi tega odmika lahko za posameznega člana
razreda Test shranil kakšno dodatno informacijo.
Test, za poljubnega člana glede na "odmik" hitro dobil to dodatno informacijo.
Problem je v tem, ker ne smem spreminjati obstoječih razredov, na volji imam samo kazalec na objekt in pa kazalec na člana tega razreda. Zanima me samo
ali je imajo lahko objekti razreda Test različen "memory layout"... Torej da bi bil lahko odmik za npr. prvega člana razreda Test pri n primerkih različen.
Kaj pa pravi standard o memory layoutu razredov...
Upam da se razumemo, kaj mislim...
Kot vidite v spodnjem primeru za vsakega člana razreda Test izpišem razliko med kazalcem objekta in člana razreda.
Tako dobim nekakšen odmik vsakega člana razreda. Ideja je ta da bi na podlagi tega odmika lahko za posameznega člana
razreda Test shranil kakšno dodatno informacijo.
std::map<ptrdiff_t /*offset*/, std::string/*dodatna info*/>in tako bi lahko za vsak objekt razreda
Test, za poljubnega člana glede na "odmik" hitro dobil to dodatno informacijo.
Problem je v tem, ker ne smem spreminjati obstoječih razredov, na volji imam samo kazalec na objekt in pa kazalec na člana tega razreda. Zanima me samo
ali je imajo lahko objekti razreda Test različen "memory layout"... Torej da bi bil lahko odmik za npr. prvega člana razreda Test pri n primerkih različen.
Kaj pa pravi standard o memory layoutu razredov...
Upam da se razumemo, kaj mislim...
#include <iostream> class Test { public: int intMember; double doubleMember; std::string strMember; std::string strMember2; }; void printMembersOffsets(const Test& t) { double Test::*p = &Test::doubleMember; std::cout << "intMember offset: " << (ptrdiff_t)&t.intMember - (ptrdiff_t)&t << std::endl; std::cout << "doubleMember offset: " << (ptrdiff_t)&t.doubleMember - (ptrdiff_t)&t << std::endl; std::cout << "doubleMember (pointer to member example) offset: " << (ptrdiff_t)&(t.*p) - (ptrdiff_t)&t << std::endl; std::cout << "strMember offset: " << (ptrdiff_t)&t.strMember - (ptrdiff_t)&t << std::endl; std::cout << "strMember2 offset: " << (ptrdiff_t)&t.strMember2 - (ptrdiff_t)&t << std::endl << std::endl; } int main() { Test test; test.strMember = "Anže je kreten na kvadrat!"; printMembersOffsets(test); Test* test2 = new Test(); printMembersOffsets(*test2); delete test2; return 0; }
- spremenil: zhigatsey ()
Vesoljc ::
Memberji enega tipa objekta imajo isti layout ne glede na stevilo instanc.
kwa pa hekas? :)
kwa pa hekas? :)
Abnormal behavior of abnormal brain makes me normal...
zhigatsey ::
Mah že nekaj časa v prostem času za hobi delam tole in rabim malo
optimizirati (PropertyNameVisitor)...
optimizirati (PropertyNameVisitor)...
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | "Dinamicna" sprememba razreda v C++Oddelek: Programiranje | 1932 (1324) | Spura |
» | c++ two dimensional array v classuOddelek: Programiranje | 1404 (1207) | Senitel |
» | c sharp LinkedList - NalogaOddelek: Programiranje | 1862 (1813) | Msatir |
» | [c++] Orm... ActiveRecord pattern ... nasvetOddelek: Programiranje | 1120 (996) | zhigatsey |
» | [c++] Pomoč pri izdelavi std::vector "wrapperja"Oddelek: Programiranje | 1587 (1488) | zhigatsey |