programing

구조물의 크기를 확인하려면 어떻게 해야 합니까?

bestprogram 2023. 10. 24. 21:29

구조물의 크기를 확인하려면 어떻게 해야 합니까?

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

크기가 어떻게 됩니까?

#include <stdio.h>

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

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

32비트 기계에서 "(a) == 8의 크기"를 받습니다.구조물의 전체 크기는 패킹에 따라 달라집니다.제 경우에는 기본 패킹이 4이므로 'c'는 4바이트, 'b'는 1바이트, 패딩 바이트는 3바이트를 남겨서 4:8의 다음 배수가 됩니다.이 패킹을 변경하려면 대부분의 컴파일러에서 MSVC와 같은 방식으로 변경할 수 있습니다.

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

크기는 (a) == 5 입니다.이렇게 하는 경우 라이브러리 헤더보다 패킹을 먼저 재설정하도록 주의하십시오!

다른 답변들 중 일부가 말한 것과는 달리, 대부분의 시스템에서 프래그마나 컴파일러 옵션이 없다면 구조의 크기는 최소 6바이트가 될 것이고, 대부분의 32비트 시스템에서는 8바이트가 될 것입니다.64비트 시스템의 경우 크기가 16바이트가 될 수 있습니다.항상 정렬이 작용합니다.단일 구조의 크기는 해당 크기의 배열을 할당할 수 있어야 하며, 배열의 개별 구성원이 해당 프로세서에 맞게 충분히 정렬되어야 합니다.결과적으로, 다른 사람들이 가정한 것처럼 구조의 크기가 5인 경우, 그러한 두 구조의 배열은 10바이트 길이가 될 것이고, 두 번째 배열 부재의 문자 포인터는 홀수 바이트로 정렬될 것이고, 이는 (대부분의 프로세서에서) 성능에 큰 병목 현상을 일으킬 것입니다.

수동으로 셀 경우 구조물의 크기는 선형을 고려한 후 각 데이터 멤버의 크기입니다.구조물에는 마법의 오버헤드 바이트가 없습니다.

정확한 값은 (a)의 크기입니다.
또한 위험을 무릅쓰고 이 경우에는 2 이상이고 16 이하라고 가정할 수도 있습니다.

이는 아키텍처 및 기본 데이터 유형을 처리하는 방식에 따라 달라집니다.또한 시스템에 자연적인 정렬이 필요한지 여부에 따라 달라집니다.

엄격하지 않고 struct를 의미한다고 가정하지만 32비트 시스템에서는 컴파일러가 struct를 패딩하는지에 따라 5바이트 또는 8바이트가 됩니다.

'엄격'이 아니라 '구조'를, '차'가 아닌 '차'를 의미하는 것 같습니다.

크기는 구현에 따라 달라집니다.대부분의 32비트 시스템에서는 포인터의 경우 5-4바이트, 문자의 경우 1바이트가 될 것입니다.저는 정렬이 여기서 효과를 발휘하지 못할 것이라고 생각하지 않습니다.그러나 'c'와 'b'를 교환하면 크기가 8바이트로 커질 수 있습니다.

네, 시험해봤는데 (g++ 4.2.3, -g 옵션 포함) 8개가 나옵니다.

구조의 크기가 2의 배수가 되도록 32비트 시스템에서 구조의 크기는 8바이트여야 합니다.이렇게 하면 구조 배열이 선언될 때 올바른 바이트 경계에서 개별 구조를 사용할 수 있습니다.이것은 마지막에 3바이트로 구조를 패딩함으로써 달성됩니다.

구조체에 포인터가 문자 뒤에 선언되어 있다면 크기는 여전히 8바이트가 되지만 포인터(4바이트 요소)를 4바이트 주소 경계에 정렬하기 위해 3바이트 패딩이 추가되었을 것입니다.

경험칙에 따르면 요소는 바이트 크기의 배수인 오프셋에 있어야 하며 구조 자체는 2의 배수인 크기여야 합니다.

언급URL : https://stackoverflow.com/questions/143025/how-do-i-find-the-size-of-a-struct