OT arm-gcc hadanka

Jan Waclawek konfera na efton.sk
Pondělí Prosinec 29 17:20:56 CET 2014


>> No, lenze potom by sizeof(TBar) mal byt prinajmensom nasobok 4, nie?
>
>Preco? TBar mas explicitne zarovnany na 1. Co nemas explicitne zarovnane 
>je union, ten bude zarovnavany na 4B. 
>
>> Takze druhe kolo, tipnite si, kolko je offsetof(TBar, b).
>
>Tu by nemal byt problem: 2


No, je to naozaj tak, a obdivujem Tvoje znalosti, skumal som to pol dna.

Ale postrada to akukolvek logiku, teda podla mna; a to rovno v dvoch
veciach:

1. Toto totiz nie je zarovnanie, ale trailing padding; t.j. to nie je
doplnenie medzery PRED 32-bitovu premennu za ucelom jej umiestnenia na
adresu delitelnu 4, ale doplnenie medzery ZA celu strukturu za ziadnym
logickym ucelom. 

2. Naviac, tym, ze som predpisal "packed" strukture, hovorim prekladacu, ze
chcem mat plnu kontrolu nad umiestnenim jednotlivych jeho poloziek, a
nevidim absolutne ziadny dovod, aby ten predpis neplatil aj pre do neho
vnorene zalezitosti. Ale neplati, treba mu to explicitne predpisat.

Je to podobne pre mna nepochopitelna a perverzna zalezitost ako dva druhy
pakovania bitfieldov a ze prave ne-gnu je default v gcc v mingw.

wek




>> On 29.12.2014 13:34, Jan Waclawek wrote:
>>> arm-none-eabi-gcc (GNU Tools for ARM Embedded Processors) 4.8.3 20131129
>>> (release) [ARM/embedded-4_8-branch revision 205641]
>>>
>>> c:/PROGRA~1/ARMTools/launchpad.net_gcc-arm-embedded/bin/arm-none-eabi-gcc
>>> -c -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -mthumb  -I.
>>> -Wpadded -MD -MP -MF .dep/ch.o.d ch.c -o objdir/ch.o
>>>
>>>
>>> Aka je vysledna hodnota a a b?
>>>
>>> wek
>>>
>>>
>>> #include<stdint.h>
>>>
>>>     typedef struct __attribute__((packed, aligned(1))) {
>>>       uint16_t a;
>>>       union {
>>>         uint32_t b;
>>>         uint16_t c[3];
>>>       };
>>>     } TBar;
>>>
>>>     typedef struct __attribute__((packed)) {
>>>       TBar a;
>>>       TBar b;
>>>     } TFoo;
>>>
>>>
>>> const uint32_t a = sizeof(TBar);
>>> const uint32_t b = sizeof(TFoo);
>>>
>>> int main(void) {
>>> }
>>>



Další informace o konferenci Hw-list