최상 답변
정확한 시퀀스 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 언어의 규칙에 따라 b
는 struct fun
의 모든 인스턴스에서 a
보다 높은 주소에 있어야합니다. 마찬가지로 c
는 b
보다 높은 주소에 있어야합니다.
결과적으로이 특정 구조가 차지할 가능성이 높습니다. 해당 아키텍처의 b
에 대한 정렬 제약으로 인해 24 바이트. 동일한 구조는 double
에 대해 4 바이트 정렬 만 필요한 아키텍처에서 16 바이트 만 필요할 수 있습니다.
믿지 않습니까?
직접 확인 :
궁극적으로 대상 플랫폼의 ABI를 참조하여 struct
는 대상 을 위해 함께 압축됩니다.
또는 sizeof
개인적으로 신경 쓰지 않지만 코드에 신경 써야하는 경우
답변
계산 방법 C에서 sizeof (struct)의 값?
그렇지 않습니다. 컴파일러가 수행합니다.
먼저, sizeof(struct)
는 구문 오류입니다. 구조 유형 또는 그러한 유형의 객체의 크기를 결정하는 방법을 묻고있을 것입니다. 정확한 것이 중요합니다. (Quora가 질문 세부 정보를 제거하는 것이 그렇게 어렵다는 것을 이해합니다.)
struct foo
라는 구조 유형 및 / 또는 이름이 지정된 해당 유형의 객체가 있다고 가정 해 보겠습니다. obj
. 유형의 크기는 sizeof (struct foo)
이고 개체의 크기 (유형의 크기와 동일)는 sizeof foo
입니다. . (괄호는 두 번째가 아닌 첫 번째 경우에 필요합니다. 실제로 sizeof
연산자에는 두 가지 형식이 있습니다. 하나는 괄호로 묶인 유형 이름에 적용되고 다른 하나는 항상 객체 이름이 아닌 경우가 많습니다.)
구성원의 크기를 더하여 구조의 크기를 계산할 수 있다고 생각할 수 있습니다. 당신은 할 수 없습니다. 컴파일러는 정렬 요구 사항을 충족하기 위해 멤버 사이에, 그리고 가능하면 마지막 멤버 뒤에 패딩을 삽입 할 수 있습니다. 구조의 크기는 최소한 구성원 크기의 합계이지만 전체 구조의 크기가 필요한 경우 sizeof
. 그것이 바로 그 목적입니다.