bitfield v avr-gcc
Miroslav Sinko
sinkomiro@rocketmail.com
Středa Červen 18 10:04:10 CEST 2008
>>> PS. asi si pripraveny na argument ze sizeof/sizeof je silne
>>> neportabilne takze ho ani vytahovat nejdem... ;-)
>>
>>Nie som a ani neviem preco by to malo byt neportabilne. Pocitam, ze nemas
>>na mysli portovanie z jazyka do jazyka, ale z platformy na platformu.
>>Jedine, co ma napada, ze by si mohol mysliet, je zarovnavanie clenov v
>>strukturach. Ale to by bol omyl, mam uz nachystany dokaz, ze pri tomto
>>nie je absolutne ziaden problem. Som pripraveny ho predlozit :-)
>Hmmmm tipujem ze rovno z normy. Mam pocit, ze som nieco take kdesi cital, >takze som dostal sam seba... ;-)
Ano :-)
http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf
6.5.3.4 The sizeof operator
3 ..... When applied to an operand that has structure or union type, the result is the total number of bytes in such an object,
including internal and trailing padding.
6 EXAMPLE 2 Another use of the sizeof operator is to compute the number of elements in an array: sizeof array / sizeof array[0]
Pre nazornost som urobil jednoduchy priklad, ktory ukazuje ako to funguje v praxi (kompilovane v MS VC6)
typedef struct{
unsigned char c1;
double d;
unsigned char c2;
}T_TEST;
void test(void){
T_TEST ttest[2];
printf("%d %d %d\n", sizeof(ttest), sizeof(T_TEST), sizeof(ttest)/sizeof(T_TEST));
memset(ttest, 0xAA, sizeof(ttest));
ttest[0].c1=1;
ttest[0].d=3.14;
ttest[0].c2=2;
ttest[1].c1=3;
ttest[1].d=0.69;
ttest[1].c2=4;
for(int i=0; i<sizeof(ttest); i++)
printf("%.2X ", *(((unsigned char*)ttest) + i));
}
Vystupy:
-jeden extrem, zarovnavanie clenov v strukturach 1 byte:
20 10 2
01 1F 85 EB 51 B8 1E 09 40 02 03 14 AE 47 E1 7A 14 E6 3F 04
-druhy extrem, zarovnavanie clenov v strukturach 16 bytov:
48 24 2
01 AA AA AA AA AA AA AA 1F 85 EB 51 B8 1E 09 40 02 AA AA AA AA AA AA AA 03 AA AA AA AA AA AA AA 14 AE 47 E1 7A 14 E6 3F 04 AA AA AA AA AA AA AA
miro
>wek
Další informace o konferenci Hw-list