Article View: be.comp.programming
Article #15297Re: probleem met structuur
From: Matthijs
Date: Mon, 16 Oct 2000 00:00
Date: Mon, 16 Oct 2000 00:00
102 lines
4112 bytes
4112 bytes
According to Wim Dumon,
> Matthijs wrote:
> > According to Scorpion,
> > > > > Ik heb volgende structuur:
> > > > >
> > > > > typedef struct {
> > > > > BYTE var1;
> > > > > DWORD var2;
> > > > > } _test;
> >
> > [is 8 bytes ipv 5]
> >
> > [is wel 5 bytes door:]
> > > > #pragma pack(push)
> > > > #pragma pack(1)
> > > >
> > > > typedef struct {
> > > > BYTE var1;
> > > > DWORD var2;
> > > > } _test;
> > > >
> > > > #pragma pack(pop)
> >
> > Mede door deze "onzin"(IMHO) denk ik er voorlopig niet aan om met C/C++
> > te beginnen. Waar slaat dit nou in hemelsnaam op(bij C/C++, niet jouw
> > antwoord)?
>
> Alignment is een eis die door de processor waarvoor je compileert
> opgelegd wordt. C en C++ compilers zorgen er door padding bytes toe te
> voegen voor dat je programma efficient runt op dergelijke processoren.
> De toegevoegde bytes verschillen van processor tot processor (en
> mogelijks van compiler tot compiler). Of je nu pascal, assembler, java,
> of iets anders compileert: alignment moet altijd gebeuren om een
> efficient programma te krijgen.
Jaja, gaat een memcopy sneller met even aantallen bytes ofzo? Geen idee
waarom. Past dan iets beter in een memory page? Worden pointers sneller
berekend met een bepaalde offset?
>
> > Is dit ANSI C (werkt het ook op een andere processor dan Intel-compatible)?
>
> Ja, dit mag (moet) volgens de ANSI standaard.
> Ja, ook op andere processoren gebeurt dit.
Ik had het hier over het #pragma gegochel. Aangezien dit lijkt op machine
code lijkt het me sterk dat dat in de ANSI standaard staat, maar ik heb
hem nooit gelezen (ambtenaren-Engels bluh), en mijn C-kennis beperkt zich
tot een "Basiscursus C/C++", Doom op Linux en MSDN voorbeelden compilen
met Borland C++...
>
> > Hoe is dit te rijmen met het antwoord van FB, die zegt
> > dat een byte is gedefd als een int?
>
> AFAIK is BYTE niet door ANSI gestandardiseerd en bijgevolg kan je gelijk
> wat BYTE noemen. Een int BYTE noemen is IMHO niet heel katholiek :-)
> > Wordt er gewoon een byte van die int afgehakt?
> >
> Als BYTE een typedef (of define) voor int is, is BYTE een int.
> Als BYTE een typedef (of define) voor char is, dan is BYTE een char.
> Maar een char is (volgens ANSI) niet perse 8 bit.
Dat was inderdaad niet zo.
>
> Waarom maak je je zorgen om de grootte en de layout van je struct ?
> Compilers zijn doorgaans de best geplaatste tools om daarover te
> beslissen...
Zoals FB al zegt, het is belangrijk als je je struct naar een bestand
wilt schrijven die uitwisselbaar moeten zijn met andere programma's of
als je structs tussen libraries van verschillende compilers uitwisselt.
In Delphi is dit ingebouwd maar wel op een makkelijkere manier:
type
Foo1 = record
b: Byte;
d: DWORD;
end;
of
type
Foo2 = packed record
b: Byte;
d: DWORD;
end;
SizeOf(Foo1) = 8;
SizeOf(Foo2) = 5;
De tweede is dus zonder padding voor efficiente alignment. Sommige
declaraties uit de WinAPI hebben wel "packing", maar sommige niet, dus ik
denk dat VC en Delphi wel dezelfde manier van padding voor alignment
aanhouden.
Matthijs
--
WinAmp playing Iron Maiden - Wasted Years
Technical Details
Message-ID:
<MPG.14556fd677bb3e20989722@news.xs4all.nl>Path:
arc1-ca.pugleaf.net!unknown!not-for-mailReferences:
<UljG5.29720$s31.471928@afrodite.telenet-ops.be> <3MlG5.19859$Z7.336199@nlnews00.chello.com> <A9mG5.31247$s31.493710@afrodite.telenet-ops.be> <MPG.14552ffc56413268989718@news.xs4all.nl> <39EB29AF.8AEC6FA7@easics.be>Show Full Headers
Complete Article Headers
X-Google-Language: DUTCH,ASCII-7-bit X-Google-Thread: 107324,f57e95232f06f286 X-Google-Attributes: gid107324,public X-Google-Thread: fcea4,f57e95232f06f286 X-Google-Attributes: gidfcea4,public From: Matthijs <matthijslaan@NOSPAMcia-agent.com> Subject: Re: probleem met structuur Date: 2000/10/16 Message-ID: <MPG.14556fd677bb3e20989722@news.xs4all.nl> X-Deja-AN: 682171439 References: <UljG5.29720$s31.471928@afrodite.telenet-ops.be> <3MlG5.19859$Z7.336199@nlnews00.chello.com> <A9mG5.31247$s31.493710@afrodite.telenet-ops.be> <MPG.14552ffc56413268989718@news.xs4all.nl> <39EB29AF.8AEC6FA7@easics.be> X-Complaints-To: abuse@xs4all.nl X-Trace: news1.xs4all.nl 971723367 1577 194.109.156.251 (16 Oct 2000 19:09:27 GMT) Organization: XS4ALL Internet BV NNTP-Posting-Date: 16 Oct 2000 19:09:27 GMT Newsgroups: be.comp.programming,nl.comp.programmeren