ThundeRatz / STM32RF24

:sparkles: Library for handling the nRF24L01 radio frequency module.
https://thunderatz.org
MIT License
6 stars 1 forks source link

Declaração das structs #1

Closed FelipeGdM closed 4 years ago

FelipeGdM commented 4 years ago

Dando uma olhada no código da biblioteca, me surgiu uma dúvida existencial. Por que a struct é declarada com __attribute__((packed)) ? https://github.com/ThundeRatz/STM32RF24/blob/10ad73aac27579ba8762adc290820215a771dce0/inc/rf24_platform.h#L39

Confesso que tive que pesquisar na documentação do gcc pra saber o que isso faz

This attribute, attached to an enum, struct, or union type definition, specified that the minimum required memory be used to represent the type.

Specifying this attribute for struct and union types is equivalent to specifying the packed attribute on each of the structure or union members. Specifying the -fshort-enums flag on the line is equivalent to specifying the packed attribute on all enum definitions.

É realmente necessário fazer isso? Estamos economizando alguns poucos bytes nessa brincadeira, mas como não teremos a declaração de muitas variáveis do tipo rf24_platform_t, não vejo uma economia de memória significativa.

Se não for estritamente necessário, acho que é melhor simplificar e tirar esse atributo da declaração

Is gcc's attribute((packed)) / #pragma pack unsafe? Why you shouldn’t use attribute((packed))

LucasHaug commented 4 years ago

De fato, pra esse caso não precisa usar esse atributo, essa struct não tem nenhuma necessidade de alinhamento específico ou de "empacotar" os membros da struct.

LucasHaug commented 4 years ago

Só por curiosidade, tipo nesse caso aqui era necessário por exemplo usar o __attribute__((packed)) porque essa struct aí é o pacote de dados que nesse caso aí eu vou mandar por USB, então como o pacote não pode ter esse padding bytes, tem que estar tudo juntinho.