구조체 패딩에 관해...

eminency의 이미지

패딩과 structure alignment에 대해서는 대충 알고 있다고 생각했는데...
왜 아래의 구조체의 sizeof 결과가 6으로 나올까요? 이해가 잘...-_-;;

같은 데이터형이 연속된 것이 이유인 것 같긴 한데... 그래도 8이 나와야 되는거 아닌가요?

struct test {
  char a;
  char b[4];
  char c;
};
바라미의 이미지

위 구조체의 sizeof의 결과가 6이 나온게 맞습니다.

구조체에 들어있는 구성이 char 변수 2개와 char형 배열 하나입니다.
그렇다면 char 형이 1바이트를 차지하므로 char형 변수들의 합은 2바이트가 되고 char 배열은 배열의 길이가 4 이므로 4바이트 (char * 4) 가 됩니다.
그러면 변수들의 합과 배열을 합하면 2+4 , 즉 6이 되지요.

익명 사용자의 이미지

아마도 맴버 변수가 char형으로만 이루어져 있다는 점 때문인 것 같군요.

메모리 상의 정렬 제한이 존재하는 환경이라 하더라도, c언어의 정의 상 char형 배열에 대해서는 각각의 원소에 대해 직접 접근이 가능해야 합니다. char a[8]의 두번째 원소 a[1]의 주소가 4의 배수가 아니라도 직접 접근이 가능해야 한다는 뜻이지요. 해당하는 환경에서 4바이트 단위의 메모리 정렬 제한이 존재한다면, 쉬프트 연산이나 기타 방법을 써서라도 C 컴파일러는 그 동작을 구현해야 할 의무가 있습니다.

근데 위의 구조체 test는 맴버 변수가 모두 char형 혹은 char형 배열이므로, 딱히 정렬제한을 위해 구조체 안에 빈공간을 넣을 필요가 없습니다. 넣으나 안넣으나 정렬제한을 어기게 되는 것은 마찬가지니까요.

익명 사용자의 이미지

H/W 및 컴파일러별로 특성이 상이 할 수 있으니, 유의하시기 바랍니다.