2013-05-08 4 views
2

다음과 같이 두 개의 구조가 정의되어 있습니다.패킹 및 언 패킹 된 구조의 메모리 레이아웃

#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라고 가정 할 수 있습니다.

답변

2

아니요.이 구조체의 압축을 푼 버전에도 여전히 패딩이있을 수 있습니다. 오늘날 그러한 구현이 없다고해도 앞으로는 128 개로 균등하게 나눌 수있는 오프셋으로 정렬 할 때 모든 유형이 가장 최적 인 아키텍처가있을 수 있으며, 압축되지 않은 버전의 멤버 중 120 및 96 비트의 패딩을 지원합니다. 컴파일러가이를 활용할 수 있습니다. Stackoverflow는 영원합니다.

0

의 모든 아키텍처는 매우 광범위한 적용 범위이기 때문에 대답은 "가능"하지만 "보장"되지는 않습니다. 읽기/쓰기 성능이 uint8_t보다 큰 경계에서 읽기 및 쓰기를 유지하는 메모리 아키텍처를 가진 일부 시스템을 상상할 수 있습니다.

압축 될 때 컴파일러는 특정 아키텍처에 대해 종종 최적이 아닌 읽기 전용/쓰기 코드를 사용하지만 구조체 멤버에 액세스하는 것과 관련하여 올바른지 확인하십시오.

+0

아니요.'uint8_t'는 패딩 (가질 수 없음) 또는 주소 지정 가능한 최소 타입 ('CHAR_BIT == 8 '을 의미 함) 중 하나를 의미합니다. – Sebivor

+0

@undefinedbehaviour - CHAR_BIT == 16 인 고정 소수점 DSP에서 작업 한 적이 없습니다. uint8_t 또는 int8_t를 선언 할 수 있지만 배열 또는 구조체의 일부인 경우 구조체의 압축 특성을 지정하지 않으면 채워집니다. –

+0

** 7.20.1.1 정확한 너비 정수 유형 ** ** 1 ** typedef 이름 intN_t는 너비 N, 채우기 없음 비트 및 2의 보수 표현을 갖는 부호있는 정수 유형을 나타냅니다. 따라서 int8_t는 너비가 정확히 8 비트 인 부호가있는 정수 유형을 나타냅니다. ** 2 ** typedef 이름 uintN_t는 너비 N이고 패딩 비트가없는 부호없는 정수 유형을 나타냅니다. 따라서 uint24_t는 너비가 이고 부호가 24 비트 인 부호없는 정수 유형을 나타냅니다. – Sebivor