답변
나는 struct와 strict가 아니라고 가정합니다. 그러나 32 비트 시스템에서는 컴파일러가 구조체를 패딩하는지에 따라 5 또는 8 바이트가됩니다.
'엄격함'이 아니라 '구조', 그리고 '숯'대신 '숯'이 사용 된 것으로 의심됩니다.
크기는 구현에 따라 다릅니다. 대부분의 32 비트 시스템에서는 포인터에 대해 5 - 4 바이트, char에 대해 5 바이트가됩니다. 나는 정렬이 여기에 작용할 것이라고 믿지 않는다. 그러나 'c'와 'b'를 바꾼 경우 크기가 8 바이트까지 커질 수 있습니다.
좋아, 나는 (-g 옵션, g ++ 4.2.3) 그것을 밖으로 시도하고 나는
정렬 * 수도 있습니다 * 재생할 수 있습니다. – jop
이 아키텍처와 어떻게 기본 데이터 유형을 취급에 따라 달라집니다 (8)을 얻는다. 또한 시스템이 자연 정렬을 필요로하는지 여부에 달려 있습니다.
정확한 값은 크기 (a)입니다.
또한 위험을 감수하고 2보다 크지 않고 16보다 크지 않다고 가정합니다.
이론 상으로는 포인터의 구현과 크기가 컴파일러에 따라 다르므로 상한이 없지만 표준에 따라 동작합니다. – Skizz
다른 답변과 달리 대부분의 시스템에서 pragma 또는 compiler 옵션을 사용하면 구조체의 크기는 최소 6 바이트가되고 대부분의 32 비트 시스템에서는 8 바이트가됩니다. 64 비트 시스템의 경우 크기는 쉽게 16 바이트가 될 수 있습니다. 정렬이 작용합니다. 항상. 단일 구조체의 크기는 이러한 크기의 배열을 할당 할 수 있어야하며 배열의 개별 구성원은 문제의 프로세서에 대해 충분히 정렬되어야합니다. 결과적으로 구조체의 크기가 다른 것으로 가정되면서 구조체의 크기가 5 인 경우 두 구조의 배열은 10 바이트 길이가되고 두 번째 배열 멤버의 char 포인터는 홀수 바이트에 정렬됩니다. 프로세서)는 성능에 큰 병목 현상을 일으 킵니다.
그리고 오래된 68k macs에서 충돌! –
정렬이 여기에 영향을 미치지 않는다고 가정 한 이유는 두 멤버가 서로 패딩하지 않고 올바르게 정렬된다는 것입니다. 나는 sizeof가 패딩을 설명 할 것이라고는 예상하지 못했습니다. 필자의 대답에 대한 편집에서 지적했듯이 나의 가설은 실험적으로 반증되었다. –
#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. 않도록주의 제공 라이브러리 헤더 앞에 포장을 다시 설정하십시오!
작동하는지 확인하려면 : printf ("sizeof (a) == % d", (int) sizeof (a)), ' –
@ ThomasPadron-McCarthy 대신'printf ("% zu", sizeof (a)) '... –
@ H2CO3 : 그렇습니다. 너무 현대적으로 작동합니다. –
구조체의 크기가 32 비트 시스템에서 8 바이트가되어야 구조체의 크기가 2의 배수가됩니다. 이렇게하면 구조체 배열을 선언 할 때 올바른 바이트 경계에서 개별 구조체를 사용할 수 있습니다. 이것은 마지막에 구조체를 3 바이트로 패딩하여 이루어집니다.
구조체가 char 뒤에 선언 된 포인터를 가지고 있다면, 여전히 크기가 인 8 바이트가되지만 포인터 (4 바이트 요소)가 4 바이트로 정렬되도록 3 바이트 패딩이 추가됩니다 주소 경계.
규칙은 요소가 바이트 크기의 배수 인 오프셋에 있어야하며 구조 자체는 2의 배수 인 크기 여야한다는 것입니다.
비교적 드문 일이지만 char 배열 만 포함하는 구조는 홀수 크기를 가질 수 있습니다 : struct unusual {char a [3]; char b [4]; }; '는 부작용을 일으키지 않고 크기가 7 일 수 있습니다. 컴파일러는 여전히 그것을 8 바이트로 채울 수 있지만 그렇게 할 필요는 분명하지 않습니다. –
구조체의 크기는 수동으로 계산하려는 경우 정렬을 고려한 후 각 데이터 멤버의 크기에 불과합니다. 구조체에는 마술 오버 헤드 바이트가 없습니다.
- 1. 최대 스택 크기는 어떻게 찾습니까?
- 2. C로 마운트 된 USB 플래시 드라이브의 크기는 어떻게 찾습니까?
- 3. 주어진 텍스트를 손상시키지 않는 가장 큰 글꼴 크기는 어떻게 찾습니까?
- 4. MacOS X에서 스택의 기본 주소와 크기는 어떻게 찾습니까?
- 5. 전화 번호는 어떻게 찾습니까?
- 6. 발신자 기능은 어떻게 찾습니까?
- 7. - 프로세스 ID는 어떻게 찾습니까?
- 8. CoreLocation은 어떻게 장치를 찾습니까?
- 9. 두 구조체의 크기는 동일하지만 구조체 인스턴스가 하나만 포함되어 있습니다.
- 10. 폴더의 크기는 어떻게 얻습니까?
- 11. PDF 크기는 어떻게 지정됩니까?
- 12. 프레임의 크기는 어떻게 변경합니까?
- 13. javac.exe는 프로그래밍 방식으로 어떻게 찾습니까?
- 14. Solaris에서 gcc가 어떻게 라이브러리를 찾습니까?
- 15. 디버깅에서 호출하는 방법을 어떻게 찾습니까?
- 16. ContentResolver는 어떻게 해당 ContentProvider를 찾습니까?
- 17. 메쉬 객체의 높이를 어떻게 찾습니까?
- 18. RichTextBox에서 반복되는 텍스트는 어떻게 찾습니까?
- 19. jQuery를 사용하여 #을 어떻게 찾습니까?
- 20. RESTful 웹 서비스는 어떻게 찾습니까?
- 21. 셀 내용에서 행을 어떻게 찾습니까?
- 22. nosetests는 실행할 테스트를 어떻게 찾습니까?
- 23. classpath에서 .jar의 리소스를 어떻게 찾습니까?
- 24. osx : 디스크 I/O 캐시 (예 : 쓰기 캐시)의 크기는 어떻게 찾습니까?
- 25. 어떻게 구조체를 구조체의 포인터로 마샬링합니까?
- 26. C에서 구조체의 메모리를 어떻게 관리합니까?
- 27. 배열을 포함하는 구조체의 크기
- 28. SharePoint 목록의 크기는 어떻게 결정합니까?
- 29. 페이지 테이블 크기는 어떻게 계산합니까?
- 30. UILabel의 글꼴 크기는 어떻게 계산합니까?
'sizeof (a)'는 유효하지 않습니다. C. C++에서도 유효합니다. – alk