12. september 2002 - 20:32Der er
4 kommentarer og 1 løsning
placering i hukommelsen?
1) Når jeg definerer en klasse og opretter en instans af klassen så kan jeg finde instansens position i hukommelsen via en pointer... men hvad er det rent faktisk den pointer peger på ... er det den først variabel / funktion / CTOR ... Eller noget andet?
2) Hvis jeg opretter en klasse class C { private: int a; int b; int c; };
kan jeg så kopierer en værdi til variablen d ved at gøre således ? C c; int p=123; int offset=sizeof(int)*2;
memcpy(&c,&p,sizeof(int));
Hvis ikke dette kan lade sig gøre ... hvordan er det så muligt at finde frem til a b c 's position i hukommelsen ?
2b) Jeg går ud fra at det er kompileren der afgør a b c's position i hukommelsen men efter hvilket regelsæt ?
2) nej, du bruger memcopy forkert, du kopier værdien af p (123) ind på a's plads. Du kan godt bruge offset (c's addresse + 2*int), men det kræver din compiler kan bruge packed structures.
2) hvis du kun har int's i din struktur, er der ingen problemer, da de bliver lagt efter hinanden i hukommelsen. problemet er når der er ikke alignede adresser, f.eks.
class x { char a; int b; short c; }
hvis den ikke bruger packed structure kommer det til at se sådan ud:
Du får ikke en pointer til en direkte adresse i hukommelsen under Windows, du får en pointer til adressen i den virtuelle blok windows skaber for hver process (og den er på ca. 4 GB).
Windows sørger effektivt for at lukke af for enhver direkte adgang til hukommelsen (nogen der kan modbevise dette?!?), og du kan fx. ikke skrive direkte i adresse 0x00000000 i hukommelsen (tænk hvis alle processer forsøgte at gøre det samtidig!!!).
Så vidt jeg har fundet ud af/læst mig til er der ikke nogen måde at skrive direkte i fysiske adresser, men kun i logiske adresser defineret af operativ systemet.
Hvis det blot er fordi du er nysgerrig om, hvordan en compiler virker så findes der en bunke bøger om emnet - også mere eller mindre gratis tilgængelig på nettet.
Men ellers kan du ikke regne med noget som helst i denne sammenhæng - det kan være forskelligt fra compiler til compiler - og fra version 1 til version 1.1 af compiler xyz. Og selvfølgelig er der forskel på om platformen benytter little - eller big endian.... Om optimering er slået til eller fra...
Hvis du kender din compiler, kan du altid lave snavs - for så at sidde og bruge timer på at finde ud af, hvorfor tingene pludselig ikke virker efter du har installeret en servicepack.
Hvis det er noget du har brug for i en "rigtig" applikatin, skal du gentænkte den ;-)
Du kan adressere de enkelte elementer i structuren direkte vha. pointeren:
C c; C *pC = &c;
pC->a = 1; pC->b = 2; pC->c = 3;
På denne måde behøver du ikke bekymre dig om hvorvidt der er lavet byte, word eller quad alignment på data-blokken. (Dvs. om hvert element fylder et multiplum af 1, 2 eller 4 bytes.)
Du kan i BCB styre alingment vha.
#pragma -a<n>
hvor <n> er 1, 2, 4, 8 eller 16. (Default er 4.) Hvis du vil finde offsettet i bytes fra starten af strukturen, kan du f.eks. gøre sådan her:
int offset = (int)pC->C - (int)pC;
idet adressen på C variablen inde i C-klassen, jo ligger efter adressen på starten af klassen.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.