sourcecode

C의 구조 크기

copyscript 2022. 8. 3. 23:09
반응형

C의 구조 크기

중복 가능성:
구조물의 크기가 각 부재의 크기 합계와 같지 않은 이유는 무엇입니까?

다음 C 코드를 고려합니다.

#include <stdio.h>    

struct employee
{
  int id;
  char name[30];  
};

int main()
{
  struct employee e1;      
  printf("%d %d %d", sizeof(e1.id), sizeof(e1.name), sizeof(e1));
  return(0);
}

출력은 다음과 같습니다.

4 30 36

구조물의 크기가 개별 성분 변수의 크기 합계와 같지 않은 이유는 무엇입니까?

컴파일러는 정렬 요건에 대한 패딩을 추가할 수 있습니다.이는 구조체 필드 사이의 패딩에만 적용되는 것이 아니라 구조체 끝에도 적용될 수 있습니다(구조체 유형의 배열이 각 요소를 적절하게 정렬하도록 함).

예를 들어 다음과 같습니다.

struct foo_t {
    int x;
    char c;
};

이 경우에도c필드에는 패딩이 필요하지 않습니다.구조에는 일반적으로sizeof(struct foo_t) == 8(32비트 시스템의 경우 - 오히려 32비트가 있는 시스템)inttype)의 경우, 3 바이트의 패딩이 필요하기 때문에,c들판.

시스템에 패딩이 필요하지 않을 수 있지만(x86이나 Cortex M3 등), 컴파일러는 성능상의 이유로 패딩을 추가할 수 있습니다.

전술한 바와 같이 C 컴파일러는 정렬 요건에 대한 패딩을 추가합니다.이러한 요건은 메모리 서브시스템과 관련된 경우가 많습니다.일부 유형의 컴퓨터에서는 4바이트와 같은 일부 '나이스' 값까지만 메모리에 액세스할 수 있습니다.이것은 종종 단어의 길이와 동일합니다.따라서 C 컴파일러는 접근하기 쉽도록 구조 내의 필드를 이 값에 맞출 수 있습니다(예를 들어 4바이트 값은 4바이트로 정렬해야 합니다). 또한 구조 하부에 패딩하여 구조를 따르는 데이터를 정렬할 수 있습니다.다른 이유도 있다고 생각합니다.자세한 내용은 이 위키피디아 페이지를 참조하십시오.

기본 얼라인먼트는 아마도 4바이트입니다.30바이트 요소가 32를 얻거나 구조 전체가 다음 4바이트 간격으로 반올림되었습니다.

6바이트로 정렬하는 것은 이상하지 않습니다.주소는 여러 개에서4로 정렬되어 있기 때문입니다.

즉, 기본적으로는 34바이트의 구조가 있고 다음 구조는 4의 배수인 주소에 배치해야 합니다.34 이후의 가장 가까운 값은 36입니다.그리고 이 패딩 영역은 구조물의 크기에 포함됩니다.

언급URL : https://stackoverflow.com/questions/1841863/size-of-struct-in-c

반응형