Evo jednog prljavog C-ovskog prijedloga za rjesenje problema iz naslova:
http://web.studenti.math.hr/~venovako/UuPR/displ.c
Ako zelite, moze copy-paste i ovdje:
[code:1]#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct {
double d;
char c;
float f;
} S;
static S *s;
ptrdiff_t S_displ_d() { return 0; }
ptrdiff_t S_displ_c() { return ((char*)&(s->c) - (char*)&(s->d)); }
ptrdiff_t S_displ_f() { return ((char*)&(s->f) - (char*)&(s->d)); }
int main() {
const size_t
s = sizeof(S);
const ptrdiff_t
d = S_displ_d(),
c = S_displ_c(),
f = S_displ_f();
printf("sizeof(S): %d\n", s);
printf("Displacement od S.d: %d\n", d);
printf("Displacement od S.c: %d\n", c);
printf("Displacement od S.f: %d\n", f);
return EXIT_SUCCESS;
}[/code:1]
Primijetite da iako je [i]s[/i] NULL-pointer, displacementi se zapravo racunaju pri kompajliranju bez efektivnog dereferenciranja tog pointera.
Evo sto veli [i]student[/i]:
[code:1]sizeof(S): 16
Displacement od S.d: 0
Displacement od S.c: 8
Displacement od S.f: 12[/code:1]
Naravno, kod vas moze biti drugacije.
P.S. Prica o extent-u s vjezbi je simplificirana verzija stvarne. Vise mozete procitati u MPI standardu. Generalno se vodite ovime:
Ako struktura sadrzi podatak koji mora biti na adresi A t.d. A mod M = 0, onda potrazite najveci takav M i najmanji njegov visekratnik <= sizeof(strukture). Npr. kompajler moze zahtijevati da su podaci tipa double na adresama koje su djeljive s 8, a za neke druge tipove je dovoljno da su adrese djeljive s 4 (primjer float-a gore). U nacelu su svi M-ovi parni (stovise, potencije od 2), pa je dovoljno gledati najveci M - u protivnom stvari postaju dosta kompliciranije, no sve je objasnjeno u standardu, a slobodno je (cak dobrodoslo) i pitati...
[size=9][color=#999999]Added after 1 hours 5 minutes:[/color][/size]
Neke vrsti "opce kulture" ali i razumijevanja konkretnog problema radi, zgodno je pogledati npr.:
http://en.wikipedia.org/wiki/Data_structure_alignment
Evo jednog prljavog C-ovskog prijedloga za rjesenje problema iz naslova:
http://web.studenti.math.hr/~venovako/UuPR/displ.c
Ako zelite, moze copy-paste i ovdje:
Kod: | #include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct {
double d;
char c;
float f;
} S;
static S *s;
ptrdiff_t S_displ_d() { return 0; }
ptrdiff_t S_displ_c() { return ((char*)&(s->c) - (char*)&(s->d)); }
ptrdiff_t S_displ_f() { return ((char*)&(s->f) - (char*)&(s->d)); }
int main() {
const size_t
s = sizeof(S);
const ptrdiff_t
d = S_displ_d(),
c = S_displ_c(),
f = S_displ_f();
printf("sizeof(S): %d\n", s);
printf("Displacement od S.d: %d\n", d);
printf("Displacement od S.c: %d\n", c);
printf("Displacement od S.f: %d\n", f);
return EXIT_SUCCESS;
} |
Primijetite da iako je s NULL-pointer, displacementi se zapravo racunaju pri kompajliranju bez efektivnog dereferenciranja tog pointera.
Evo sto veli student:
Kod: | sizeof(S): 16
Displacement od S.d: 0
Displacement od S.c: 8
Displacement od S.f: 12 |
Naravno, kod vas moze biti drugacije.
P.S. Prica o extent-u s vjezbi je simplificirana verzija stvarne. Vise mozete procitati u MPI standardu. Generalno se vodite ovime:
Ako struktura sadrzi podatak koji mora biti na adresi A t.d. A mod M = 0, onda potrazite najveci takav M i najmanji njegov visekratnik ⇐ sizeof(strukture). Npr. kompajler moze zahtijevati da su podaci tipa double na adresama koje su djeljive s 8, a za neke druge tipove je dovoljno da su adrese djeljive s 4 (primjer float-a gore). U nacelu su svi M-ovi parni (stovise, potencije od 2), pa je dovoljno gledati najveci M - u protivnom stvari postaju dosta kompliciranije, no sve je objasnjeno u standardu, a slobodno je (cak dobrodoslo) i pitati...
Added after 1 hours 5 minutes:
Neke vrsti "opce kulture" ali i razumijevanja konkretnog problema radi, zgodno je pogledati npr.:
http://en.wikipedia.org/wiki/Data_structure_alignment
|