다음과 같이 두 개의 구조가 정의되어 있습니다.패킹 및 언 패킹 된 구조의 메모리 레이아웃
#include<stdint.h>
typedef struct
{
uint32_t a;
uint8_t b;
uint8_t pad[3]; //padding here is added intentionally.
uint32_t c;
}A;
typedef struct
{
uint32_t a;
uint8_t b;
uint8_t pad[3];
uint32_t c;
}__attribute__((__packed__)) B;
이 두 구조체는 모든 하드웨어 플랫폼에서 정확히 동일한 메모리 레이아웃을 보장합니까? 컴파일러는 항상 gcc라고 가정 할 수 있습니다.
아니요.'uint8_t'는 패딩 (가질 수 없음) 또는 주소 지정 가능한 최소 타입 ('CHAR_BIT == 8 '을 의미 함) 중 하나를 의미합니다. – Sebivor
@undefinedbehaviour - CHAR_BIT == 16 인 고정 소수점 DSP에서 작업 한 적이 없습니다. uint8_t 또는 int8_t를 선언 할 수 있지만 배열 또는 구조체의 일부인 경우 구조체의 압축 특성을 지정하지 않으면 채워집니다. –
** 7.20.1.1 정확한 너비 정수 유형 ** ** 1 ** typedef 이름 intN_t는 너비 N, 채우기 없음 비트 및 2의 보수 표현을 갖는 부호있는 정수 유형을 나타냅니다. 따라서 int8_t는 너비가 정확히 8 비트 인 부호가있는 정수 유형을 나타냅니다. ** 2 ** typedef 이름 uintN_t는 너비 N이고 패딩 비트가없는 부호없는 정수 유형을 나타냅니다. 따라서 uint24_t는 너비가 이고 부호가 24 비트 인 부호없는 정수 유형을 나타냅니다. – Sebivor