programing

크기의 내부 메커니즘(단위: C?

batch 2023. 7. 15. 09:57
반응형

크기의 내부 메커니즘(단위: C?

저는 C에서 구조물의 크기를 얻기 위해 size를 사용하지만, 제가 받은 결과는 예상치 못한 것입니다.

struct sdshdr {
    int len;
    int free;
    char buf[];
};


int main(){
    printf("struct len:%d\n",(sizeof(struct sdshdr)));
    return 0;
} //struct len:8, with or without buf

제 질문은 왜 그러냐는 것입니다.buf어떤 공간도 차지하지 않고 왜 크기가int64비트 CPU에 still 4를 입력하시겠습니까?

다음은 에서 나온 출력입니다.gcc -v:

Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)
Target: x86_64-apple-darwin14.4.0
Thread model: posix  

[]은(는) 유연한 어레이 멤버입니다.C 표준은 다음과 같이 명시적으로 말하기 때문에 구조물의 전체 크기로 계산되지 않습니다.

6.7.2.1/18

이름이 지정된 멤버가 둘 이상인 구조의 마지막 요소는 불완전한 배열 유형을 가질 수 있습니다. 이를 유연한 배열 멤버라고 합니다.대부분의 경우 Flexible Array 멤버는 무시됩니다.특히, 구조물의 크기는 생략이 의미하는 것보다 더 많은 후행 패딩을 가질 수 있다는 점을 제외하고는 유연한 배열 부재가 생략된 것과 같습니다.

유연한 배열 멤버의 목적은 구조체 뒤에 후행 데이터를 동적으로 할당하는 것이기 때문에 이는 설계상 의도된 것입니다. (구조체가 파일 헤더, 프로토콜 헤더 등인 경우)

비표준 gcc 확장과 C99 이전의 오래된 "구조 해킹"에 대한 논의를 포함한 예.

C99 이후에는 구조체의 끝에 있는 배열의 크기가 생략될 수 있습니다.의 목적으로sizeof(struct)이 배열은 크기가 0인 것처럼 보일 것입니다(구조체에 약간의 패딩을 추가할 수 있지만). 그러나 의도는 길이가 유연하도록 하는 것입니다. 즉, 구조체에 공간을 할당할 때 마지막에 배열에 원하는 추가 공간을 할당해야 합니다. (경계를 벗어나는 것을 피하기 위해,어레이의 실제 할당된 길이는 어딘가에 저장되어야 합니다.)

C99 이전에는 구조체의 끝에 크기가 1인 배열(또는 컴파일러가 허용하는 경우 0인 배열)을 가지고 더 많은 공간을 할당하는 것이 상당히 일반적인 해킹이었기 때문에 C99는 주어진 크기가 없는 유연한 배열 멤버를 도입함으로써 이러한 관행을 명시적으로 허용했습니다.

GNU c 확장자로서 길이가 0인 배열이 있습니다.

GNU 확장자로서 요소의 수는 0만큼 작을 수 있습니다.제로 길이 배열은 가변 길이 객체의 헤더인 구조의 마지막 요소로 유용합니다.

를 들어, gnuc 매뉴얼의 이 코드를 생각해 보세요.

 struct line
 {
   int length;
   char contents[0];
 };

 {
   struct line *this_line = (struct line *)
     malloc (sizeof (struct line) + this_length);
   this_line -> length = this_length;
 }

ISO C99에서는 구문 및 의미론이 약간 다른 유연한 어레이 멤버를 사용합니다.

  • Flexible Array 멤버는 0 없이 content[]로 작성됩니다.

  • Flexible Array 멤버의 형식이 불완전하여 연산자 크기가 적용되지 않을 수 있습니다.길이가 0인 어레이의 원래 구현을 통해 의 크기는 0으로 평가됩니다.

  • 유연한 배열 멤버는 비어 있지 않은 구조체의 마지막 멤버로만 나타날 수 있습니다.

  • 유연한 배열 부재를 포함하는 구조, 또는 그러한 구조(가능하면 재귀적으로)를 포함하는 결합은 구조의 구성원 또는 배열의 요소가 될 수 없습니다.(그러나 이러한 사용은 GCC에서 확장으로 허용됩니다.)

buf에 기에가 .flexible array member유형을 되지 않을 수 . 반면에 Flexible Array의 구현체인 "flexible Array"는 "flexible Array"입니다.zero-length arrays,sizeof evaluates to zero.

언급URL : https://stackoverflow.com/questions/31318740/internal-mechanism-of-sizeof-in-c

반응형