2008-09-27 8 views

답변

0

나는 struct와 strict가 아니라고 가정합니다. 그러나 32 비트 시스템에서는 컴파일러가 구조체를 패딩하는지에 따라 5 또는 8 바이트가됩니다.

0

'엄격함'이 아니라 '구조', 그리고 '숯'대신 '숯'이 사용 된 것으로 의심됩니다.

크기는 구현에 따라 다릅니다. 대부분의 32 비트 시스템에서는 포인터에 대해 5 - 4 바이트, char에 대해 5 바이트가됩니다. 나는 정렬이 여기에 작용할 것이라고 믿지 않는다. 그러나 'c'와 'b'를 바꾼 경우 크기가 8 바이트까지 커질 수 있습니다.

좋아, 나는 (-g 옵션, g ++ 4.2.3) 그것을 밖으로 시도하고 나는

+1

정렬 * 수도 있습니다 * 재생할 수 있습니다. – jop

1

이 아키텍처와 어떻게 기본 데이터 유형을 취급에 따라 달라집니다 (8)을 얻는다. 또한 시스템이 자연 정렬을 필요로하는지 여부에 달려 있습니다.

2

정확한 값은 크기 (a)입니다.
또한 위험을 감수하고 2보다 크지 않고 16보다 크지 않다고 가정합니다.

+0

이론 상으로는 포인터의 구현과 크기가 컴파일러에 따라 다르므로 상한이 없지만 표준에 따라 동작합니다. – Skizz

9

다른 답변과 달리 대부분의 시스템에서 pragma 또는 compiler 옵션을 사용하면 구조체의 크기는 최소 6 바이트가되고 대부분의 32 비트 시스템에서는 8 바이트가됩니다. 64 비트 시스템의 경우 크기는 쉽게 16 바이트가 될 수 있습니다. 정렬이 작용합니다. 항상. 단일 구조체의 크기는 이러한 크기의 배열을 할당 할 수 있어야하며 배열의 개별 구성원은 문제의 프로세서에 대해 충분히 정렬되어야합니다. 결과적으로 구조체의 크기가 다른 것으로 가정되면서 구조체의 크기가 5 인 경우 두 구조의 배열은 10 바이트 길이가되고 두 ​​번째 배열 멤버의 char 포인터는 홀수 바이트에 정렬됩니다. 프로세서)는 성능에 큰 병목 현상을 일으 킵니다.

+0

그리고 오래된 68k macs에서 충돌! –

+0

정렬이 여기에 영향을 미치지 않는다고 가정 한 이유는 두 멤버가 서로 패딩하지 않고 올바르게 정렬된다는 것입니다. 나는 sizeof가 패딩을 설명 할 것이라고는 예상하지 못했습니다. 필자의 대답에 대한 편집에서 지적했듯이 나의 가설은 실험적으로 반증되었다. –

32
#include <stdio.h> 

typedef struct { char* c; char b; } a; 

int main() 
{ 
    printf("sizeof(a) == %d", sizeof(a)); 
} 

32 비트 시스템에서는 "sizeof (a) == 8"이됩니다. 구조체의 전체 크기는 패킹에 따라 달라집니다 : 나의 경우, 기본 패킹은 4이므로 'c'는 4 바이트를, 'b'는 1 바이트를 취하고 3 패딩 바이트를 남기고 4의 다음 배수로 가져옵니다. :이 포장을 변경하려는 경우 8. 대부분의 컴파일러는 예를 들어, MSVC에, 그것을 변경하는 방법이 있습니다

#pragma pack(1) 
typedef struct { char* c; char b; } a; 

는이 작업을 수행하는 경우는 sizeof의 (a) == 5. 않도록주의 제공 라이브러리 헤더 앞에 포장을 다시 설정하십시오!

+3

작동하는지 확인하려면 : printf ("sizeof (a) == % d", (int) sizeof (a)), ' –

+1

@ ThomasPadron-McCarthy 대신'printf ("% zu", sizeof (a)) '... –

+0

@ H2CO3 : 그렇습니다. 너무 현대적으로 작동합니다. –

0

구조체의 크기가 32 비트 시스템에서 8 바이트가되어야 구조체의 크기가 2의 배수가됩니다. 이렇게하면 구조체 배열을 선언 할 때 올바른 바이트 경계에서 개별 구조체를 사용할 수 있습니다. 이것은 마지막에 구조체를 3 바이트로 패딩하여 이루어집니다.

구조체가 char 뒤에 선언 된 포인터를 가지고 있다면, 여전히 크기가 인 8 바이트가되지만 포인터 (4 바이트 요소)가 4 바이트로 정렬되도록 3 바이트 패딩이 추가됩니다 주소 경계.

규칙은 요소가 바이트 크기의 배수 인 오프셋에 있어야하며 구조 자체는 2의 배수 인 크기 여야한다는 것입니다.

+0

비교적 드문 일이지만 char 배열 만 포함하는 구조는 홀수 크기를 가질 수 있습니다 : struct unusual {char a [3]; char b [4]; }; '는 부작용을 일으키지 않고 크기가 7 일 수 있습니다. 컴파일러는 여전히 그것을 8 바이트로 채울 수 있지만 그렇게 할 필요는 분명하지 않습니다. –

4

구조체의 크기는 수동으로 계산하려는 경우 정렬을 고려한 후 각 데이터 멤버의 크기에 불과합니다. 구조체에는 마술 오버 헤드 바이트가 없습니다.

관련 문제