Integer Bit felter ?

Tags:    delphi

Sidst i spam runden. Kan man/hvordan kan man definere antal bit som en datatype skal anvende .. som pseudo eg. integer:1 (0-1), integer:2 (0-4) etc etc ..

mit problem er jeg har et 2 dim array, og jeg gerne vil have dejlig mange attributter på hver felt, men istedet for at lave få felter som jeg bitshifter i en uendelighed, så ville jeg gerne 'tage dem ud' og placere dem som selvstændige variable, men uden at bruge flere bits til plads.

hvis et 2 dim array er 1024x1024(teoretisk upper limit jeg vil bruge ) så er der 1mb extra per byte, så det betyder ligepludselige noget hvis man har en ordenlig spand af attribs ,)


Jørgen of War ...
w w w . S t r a t e g y - w a r g a m e s . c o m





4 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 1 karma
Sorter efter stemmer Sorter efter dato
Det eksisterer ikke, og eksitstere generelt slet ikke i noget programmerings sprog (ikke dermed sagt at der ikke er undtagelser).
Mulige integer typer i Objective Pascal (Delphi):
En integer type vil altid enten være 8, 16, 32 eller 64 bit lang. Hvis du f.eks. skriver:

T10BitInt = 0..1023;

Vil det blot blive rundet opad, således at T10BitInt faktisk fylder 16 bit. Du vil dog få det ud af det, at du får en compile time error, hvis du forsøger at sætte det til en værdi uden for området. (og runtime error hvis du kompilerer med runtime range check (mener det er +R))

Så længe du kun skal holde det byte-alignet kan du lave en record:
Fold kodeboks ind/udKode 


Hvis summen af størrelsen på felterne ikke er et multiplum af 32, skal du skrive packed foran record. Bemærk dog at det vil kunne nedsætte din performance betydeligt.

Fold kodeboks ind/udKode 


[Redigeret d. 22/09-05 16:23:42 af Kasper Fabæch Brandt]



Du har forklaret ulemperne ved 32-bit variabler, så nu vil jeg forklare dig ulemperne ved variabler mindre end 32 bit.

CPU'ens cache er "linier" af 32 bit (altså selvfølgelig kun på 32-bit cpu'er), og hvis du tilgår en variabel på fx 4 bit, som derfor ikke er "aligned" i forhold til "linierne", så får du cache misses , hvis du næste gang tilgår en 32-bit fordi at dens "data" er længere end 1 linie (det kan jeg nok ikke forklare godt nok med kort tekst, men du kan læse om det mange steder), hvilket i værste fald kan betyde mange procents langsommere kald, hvis du tilgår dem mange gange, i forhold til at tilgå 32-bit variabler på de nuværende cpu'er.
Kort sagt skal du tænke på om du overskrider cache linien næste gang du læser en variabel.

1101110100010110000101000001

[Redigeret d. 13/01-05 13:30:33 af Nicolai Lyster Fersner]



Du har forklaret ulemperne ved 32-bit variabler, så nu vil jeg forklare dig ulemperne ved variabler mindre end 32 bit.

CPU'ens cache er "linier" af 32 bit (altså selvfølgelig kun på 32-bit cpu'er), og hvis du tilgår en variabel på fx 4 bit, som derfor ikke er "aligned" i forhold til "linierne", så får du cache misses , hvis du næste gang tilgår en 32-bit fordi at dens "data" er længere end 1 linie (det kan jeg nok ikke forklare godt nok med kort tekst, men du kan læse om det mange steder), hvilket i værste fald kan betyde mange procents langsommere kald, hvis du tilgår dem mange gange, i forhold til at tilgå 32-bit variabler på de nuværende cpu'er.
Kort sagt skal du tænke på om du overskrider cache linien næste gang du læser en variabel.

1101110100010110000101000001

[Redigeret d. 13/01-05 13:30:33 af Nicolai Lyster Fersner]


tror nu stadig en double lykke vil have spatial caching fordele. anwyays, i see you point. inforstået forstår jeg at du anbefalder at bruge byte aligned datatyper som der så kan manipuleres efter de er hentet ved bitshifting..




Din metode vil vist alligevel virke, for jeg kom lige til at tænke på, at compileren jo "padder" strukturen til 16 eller 32 bit som standard.
Det er vist kun hvis man specificerer "packed" foran at den ikke gør det, hvis jeg ellers husker rigtigt?

Desværre kan jeg ikke lige huske hvordan man laver sådanne bit felter i Object Pascal, så nu vil jeg træde tilbage og lade andre komme med et aktuelt svar.

1101110100010110000101000001

[Redigeret d. 13/01-05 15:29:45 af Nicolai Lyster Fersner]



t