2011-03-27 3 views
4
struct Dummy { 
    int x; 
    char y; 
}; 

int main() { 
    struct Dummy dum; 
    dum.x = 10; 
    dum.y = 'a'; 
} 

리틀 엔디안 시스템에서 구조 멤버의 레이아웃은 어떻게됩니까?구조 멤버는 리틀 엔디안 컴퓨터에 어떻게 저장됩니까?

이렇게 될 수 있을까요?

0x1000 +0 +1 +2 +3 
     ___________________ 
    x: | 10 | 0 | 0 | 0 |  
     -------------------  
    y: | 'a'| 0 | 0 | 0 | 
     ------------------- 
    0x1000 +4 +5 +6 +7 
+1

이것은 상당히 컴파일러에 따라 다릅니다. 구조체 정렬과 패딩을 다루는 것뿐만 아니라 비 고정 폭 데이터 형식도 처리합니다. –

답변

6

나는 this question이 유용하다고 생각합니다. 엔디안은 일반적으로 전체 구조가 아닌 메모리에있는 단어와 관련이 있습니다.

4

구조체 레이아웃은 기본 포장의 영향을받는 컴파일러 구현 세부 정보입니다. 엔디 언 (endianness) 은 일반적으로 만 레이아웃이 아닌 구조 멤버 값의 바이트 순서에 영향을줍니다. 컴파일러 설명서의 작은 인쇄물을 확인하거나 sizeof와 offsetof 매크로를 사용해보십시오.

질문에 문서화 한 레이아웃은 사실 32 비트 LE 컴파일러에서 매우 일반적입니다.

1

구조체 멤버가 선언 된 순서대로 필요에 따라 채우기가 삽입되므로 각 필드가 형식에 맞게 올바르게 채워지고 필요에 따라 끝에 삽입되어 각 후속 구조가 제대로 정렬되고 시작되는 배열로 삽입됩니다. 이전 구조의 끝 직후. 또한 두 요소 사이 또는 끝에 추가 불필요한 패딩이 삽입 될 수도 있습니다 (가능성은 없음).

각 필드 자체는 컴파일러 및 아키텍처의 유형에 맞게 적절히 저장됩니다. int 10은 32 비트 int를 가진 보통 little-endian 컴퓨터에 바이트 0a 00 00 00으로 저장됩니다.

관련 문제