2016-11-15 3 views
0

다음 코드는 sizeof (fpos_t) = 8 및 sizeof (f1) = 16이므로 sizeof sizeof (int) = 4. 누군가 이것을 설명 할 수 있습니까?MVC에서 이상한 sizeof 결과

int main() 
{ 
    typedef struct { 
     fpos_t fpos; 
     char* s; 
     int a; 
    } t1; 
    typedef struct { 
     fpos_t fpos; 
     int a; 
    } t2; 
    t1 it1; 
    t2 it2; 
    printf("sizeof(t1)=%d sizeof(t2)=%d ", sizeof(t1), sizeof(t2)); 
    return 0; 
} 
+0

한 단어로 설명 할 수 있습니다. * 패딩 * –

답변

0

alignment reasons의 경우 컴파일러는 패딩을 자유롭게 삽입 할 수 있습니다. 즉, 구조체의 크기가 개별 구성원 크기의 합과 반드시 ​​같지 않다는 것을 의미합니다. 이것은 C 표준에서 명시 적으로 허용됩니다.

구조체의 시작 부분, 즉 첫 번째 멤버 앞에 패딩이 허용되지 않는 유일한 위치입니다. C11 draft, 6.7.2.1에서

: 구조 개체 내에서

, 비 비트 필드 회원들과 비트 필드가 선언되고 의 순서로 증가 주소를 가지고있는 의 단위. 적절히 으로 변환 된 구조체 개체에 대한 포인터는 초기 멤버 (또는 해당 멤버가 비트 필드 인 경우 해당 멤버가 상주하는 단위)를 가리키고 그 반대의 경우도 마찬가지입니다. 구조체 개체 내에 이름이없는 패딩이있을 수 있지만 시작 부분은 이 아닙니다.

(강조 광산).

0

현재 대부분의 컴퓨터는 한 번에 "단어"(일명 8 바이트, 일명 64 비트)로만 할당 할 수 있습니다. 패딩이라고합니다.

호텔 객실로 생각하십시오. 동일한 방 (memory location)에 1 인 또는 2 인 (chars)을 머물게 하시더라도 방은 같은 크기가됩니다.