AnsweredAssumed Answered

C/C++ sizeof() struct in KDS GNU compiler

Question asked by Joaquim Martinez on Feb 23, 2017
Latest reply on Feb 24, 2017 by Bob Paddock

Hi everyone,


I want to use the sizeof() operator in order to know the number of bytes in a struct with different kind of objects (please refer to my struct detalied below). I know sizeof() for 32 bits processors by default they use 4 bytes padding aligment. That means for a "char/uint8_t" variable, the numer of bytes returned by sizeof() is 4. To avoid this situation, I would like to use the #pragma pack directive when I define my struct, because sizeof() will return the exact number of bytes, but my doubts are:


1) If it is a good practice to use #pragma pack(push, 1) directive so as to force padding to 1 byte.

2) In terms of handle and processing speed of the RAM, does #pragma pack(push,1) improve these aspects in comparison with default padding (4 bytes)?

3) There are any other issue modifying the default padding?

4) Finally, must I use the #pragma pack(pop) at the end of the definition?


Thank you very much.


My struct is:


#pragma pack(push,1)

typedef struct
LDD_CAN_TFrame BufferEstructuraTx[MaxFramesCAN];
LDD_CAN_TFrame BufferEstructuraRx[MaxFramesCAN];
uint8_t BufferTx[MaxFramesCAN];
uint8_t BufferRx[MaxFramesCAN];
bool SemaphoreTramaRxPendentProcessar[MaxFramesCAN];
bool SemaphoreTramaTxPendentProcessar[MaxFramesCAN];
uint8_t Punter_BufferRX_WriteMissatge;
uint8_t Punter_BufferRX_ReadMissatge;
uint8_t Punter_BufferTx_WriteMissatge;
uint8_t NumTramesRXPendentsProcessar;
CAN_DRIVER_TDeviceData *DeviceData;

#pragma pack(pop)




typedef struct {
LDD_CAN_TMessageID MessageID; /*!< Message ID */
LDD_CAN_TFrameType FrameType; /*!< Type of the frame DATA/REMOTE */
uint8_t *Data; /*!< Message data buffer */
uint8_t Length; /*!< Message length */
uint16_t TimeStamp; /*!< Message time stamp */
uint8_t LocPriority; /*!< Local Priority Tx Buffers */
} LDD_CAN_TFrame;


typedef struct {
CAN_MemMapPtr BaseAddr; /* Device register memory map base address */
bool EnUser; /* Enable/Disable CAN */
LDD_TEventMask AvailableEventsMask; /* Available events bit mask */
LDD_TEventMask EventMask; /* Enable/Disable events bit mask */
uint8_t MaxDataLen; /* Max number of data to be sent in one frame */
LDD_CAN_TMBIndex MaxBufferIndex; /* Number of message buffers */
LDD_CAN_TMBIndex BuffersNumber; /* Number of message buffers */
LDD_CAN_TBufferMask RxBufferMask; /* Bit mask for message buffers configured as receive */
LDD_CAN_TBufferMask TxBufferMask; /* Bit mask for message buffers configured as transmit */
LDD_CAN_TErrorMask ErrorMask; /* Variable for errors mask value */
LDD_CAN_TBufferMask IntFlagReg; /* Content of the buffer status */
LDD_CAN_TStats Stats; /* Communication statistics */
LDD_CAN_TBufferMask TransferPendingMask; /* Transfer request pending message buffer mask */
LDD_TUserData *UserData; /* RTOS device data structure */
} CAN_DRIVER_TDeviceData;