2010-06-18 3 views
0

,를 sizeof (구조) 혼란 다음 코드 조각에서

#include<stdio.h> 
typedef struct { 
    int bit1:1; 
    int bit3:4; 
    int bit4:4; 
} node; 

int main(){ 
    node n,n1,n2,ff[10]; 

    printf("%d\n",sizeof(node)); 
    return 0; 
} 

어떻게 구조의 크기를 예측합니까?

+5

왜 정확히 예측할 수 있어야한다고 생각합니까? –

+0

그리고 왜하고 싶니? –

답변

9

컴파일러와 컴파일 할 대상 플랫폼을 알지 못하면 예측할 수 없습니다.

0

일반적으로 모든 컴파일러는 유니온을 패킹하는 방법을 결정하므로 최종 크기에 대해 많은 가정을 할 수 없습니다. 매개 변수에 따라 다른 레이아웃을 결정할 수 있습니다.

3

는 플랫폼과 컴파일러 설정 (포장, 정렬, 32/64 기계)

따르면 comp.lang.c FAQ list

에에 달려있다 "그들은 더 적은 휴대용 있지만 비트 필드는 이식성이 떨어지는 것으로 생각되지 않는다 언어의 다른 부분보다. "

+1

이상한 견적 ... – jalf

1

구조체의 크기는 컴파일러 최적화 설정에 따라 변경됩니다. 나는이 구조에 대해 2에서 12 바이트 사이의 어느 곳이든 예측할 수 있습니다.

여러분이하는 것처럼 비트 필드를 사용하는 경우에도 항상 구조체의 크기를 예측할 수는 없습니다. 컴파일러는 모든 비트 필드가 int의 전체 공간을 차지하도록하거나 사용자가 지정하는 1 ~ 4 비트 만 가져갈 수 있습니다. 비트 필드를 사용하는 것은 메모리 저장 공간에 좋지만 실행 시간과 실행 파일 크기에 좋지 않습니다.

+0

컴파일러가이 구조체가 int 크기보다 작게 차지하는 것은 합법적인지 확신 할 수 없습니다. sizeof (...)는 정수를 반환해야하기 때문에 확실히 char의 크기보다 작게 차지할 수는 없습니다. – Stewart

+0

@Stewart :'sizeof (int) == 2 '인 플랫폼이 있습니다. –

+0

@Stephen : 나는 거기에 없다고 생각하지 않는다. 또한 8 비트의 배수가 아닌 플랫폼도 있으며, 내 대답에는 그 중 하나도 허용되지 않습니다. 대답은 컴파일러가 구조체를 4 비트로 만 패킹 할 수 있다는 것을 말합니다. 즉, 적어도 16 비트 이상이어야하는 int 형에서 특히 그렇습니다. – Stewart

3

일반적으로 예측할 수는 없지만 실제로는 sizeof (int)보다 더 자주 발생합니다. 어느 자체가 매우 자주 4; 덜 일반적으로 2 번, 확실하게 8 번.

대부분의 경우 비트 필드가 압축되고 대부분 int 유형은 9 비트 이상의 저장 공간을 갖습니다.

+1

int는 항상 최소 16 비트입니다. 표준에서는 이렇게 말합니다 (long은 항상 32 이상이며 C99에서는 64보다 길고 길이가 길어서 모두 크기보다 클 수 있습니다) – Spudd86

0

비트 필드 크기를 더하고 8 * sizeof (int)로 나누고 해당 값의 한도를 가져옵니다. 귀하의 예에서는 4가됩니다.

+0

기본 논리가 없습니다. 무엇이든 ... – SurDin

+0

@SurDin 컴파일러가 필드를 단단히 압축하고 sizeof (int) 크기의 블록을 사용한다고 가정합니다. – Spudd86