C에서 sizeof (struct)의 값을 계산하는 방법


최상 답변

정확한 시퀀스 sizeof(struct)는 컴파일 오류입니다. C. 특정 struct의 크기를 결정하는 방법을 묻는다고 가정합니다.

이 답변은 C 언어 정의에서 직접 제공하지 아닙니다 . 오히려 특정 타겟 아키텍처에 대한 ABI의 기능입니다. (ABI는 Application Binary Interface의 약자입니다.)

C 언어 표준은 몇 가지 광범위한 규칙을 제시합니다. 예를 들어 여러 회원이있는 struct가있는 경우 첫 번째 회원은 struct 자체와 주소를 공유하고 후속 회원은 더 높은 주소에 있어야합니다.

비트 필드에는 자체 규칙이 있습니다. 여기서는 요약하지 않겠습니다.

첫 주문의 경우 struct의 크기는 입니다. 적어도 멤버 크기의 합계만큼 큽니다 (현재 비트 필드 무시). 구성원은 정렬 제약 조건을 가질 수 있으며, 그러한 경우 환경은 구성원 사이에 패딩을 도입하고 struct 끝에 패딩을 도입 할 수 있습니다.

다음 iv를 고려하십시오. double 값에 대해 8 바이트 정렬이 필요한 아키텍처의 id = “a3303ac3a0″>

:

struct fun {

char a;

double b;

char c;

};

C 언어의 규칙에 따라 bstruct fun의 모든 인스턴스에서 a보다 높은 주소에 있어야합니다. 마찬가지로 cb보다 높은 주소에 있어야합니다.

결과적으로이 특정 구조가 차지할 가능성이 높습니다. 해당 아키텍처의 b에 대한 정렬 제약으로 인해 24 바이트. 동일한 구조는 double에 대해 4 바이트 정렬 만 필요한 아키텍처에서 16 바이트 만 필요할 수 있습니다.

믿지 않습니까?

직접 확인 :

궁극적으로 대상 플랫폼의 ABI를 참조하여 struct 대상 을 위해 함께 압축됩니다.

또는 sizeof 개인적으로 신경 쓰지 않지만 코드에 신경 써야하는 경우

답변

계산 방법 C에서 sizeof (struct)의 값?

그렇지 않습니다. 컴파일러가 수행합니다.

먼저, sizeof(struct)는 구문 오류입니다. 구조 유형 또는 그러한 유형의 객체의 크기를 결정하는 방법을 묻고있을 것입니다. 정확한 것이 중요합니다. (Quora가 질문 세부 정보를 제거하는 것이 그렇게 어렵다는 것을 이해합니다.)

struct foo라는 구조 유형 및 / 또는 이름이 지정된 해당 유형의 객체가 있다고 가정 해 보겠습니다. obj. 유형의 크기는 sizeof (struct foo)이고 개체의 크기 (유형의 크기와 동일)는 sizeof foo입니다. . (괄호는 두 번째가 아닌 첫 번째 경우에 필요합니다. 실제로 sizeof 연산자에는 두 가지 형식이 있습니다. 하나는 괄호로 묶인 유형 이름에 적용되고 다른 하나는 항상 객체 이름이 아닌 경우가 많습니다.)

구성원의 크기를 더하여 구조의 크기를 계산할 수 있다고 생각할 수 있습니다. 당신은 할 수 없습니다. 컴파일러는 정렬 요구 사항을 충족하기 위해 멤버 사이에, 그리고 가능하면 마지막 멤버 뒤에 패딩을 삽입 할 수 있습니다. 구조의 크기는 최소한 구성원 크기의 합계이지만 전체 구조의 크기가 필요한 경우 sizeof. 그것이 바로 그 목적입니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다