» »

[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.
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;
}

Vesoljc ::

Memberji enega tipa objekta imajo isti layout ne glede na stevilo instanc.

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)...


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

"Dinamicna" sprememba razreda v C++

Oddelek: Programiranje
131932 (1324) Spura
»

c++ two dimensional array v classu

Oddelek: Programiranje
111404 (1207) Senitel
»

c sharp LinkedList - Naloga

Oddelek: Programiranje
91862 (1813) Msatir
»

[c++] Orm... ActiveRecord pattern ... nasvet

Oddelek: Programiranje
51120 (996) zhigatsey
»

[c++] Pomoč pri izdelavi std::vector "wrapperja"

Oddelek: Programiranje
81587 (1488) zhigatsey

Več podobnih tem