[완료] padding 에 대해서..
글쓴이: semtul79 / 작성시간: 화, 2008/12/02 - 11:57오후
책에서 보니
보통 4바이트 단위로 패딩이 된다고 적혀있네요
그런데, 일부 시스템(솔라리스)에서는
구조체내에서 가장 큰 변수형(double 형 같은것)의 크기를 따라 간다고 합니다.
아래와 같은 구조체에서 sizeof 를 한다면..
typedef struct AAA {
char a[3];
double b;
} AAA;
리눅스에서는 12가 나옵니다. 4바이트 단위로 정렬되는것 같아요..
그런데 솔라리스에서 돌려보진 못했지만..책에 적힌것이 사실이라면 사이즈가 16이 나오겠네요..
보통 패딩이 되지 않도록 하려고 일부러 코딩시에 padding 용 변수를 넣어서 코딩을 하는데,
그렇다면 아래와 같이 char padding[3];을 넣어야 하나요? 아님.. 보통 4바이트로 정렬되니
char padding; 라고 넣는게 좋을까요?
구조체에 패딩용 변수 넣는이유가 이기종간 전송시 문제 없을려고 하는거니까..솔라리스 같은걸 생각한다면 3바이트 넣어야 할것같은데
맞나요?
typedef struct AAA {
char a[3];
char padding[3];
double b;
} AAA;
Forums:
struct a { ....
struct a {
....
} __attribute__ ((packed));
딱 맞춰서 하고싶으면 이런 방법도.. =.=
정말로 16이로군요
정말로 16이로군요 =ㅅ=)...
솔라리스... 오묘하군요...
음...
sparc/amd64 64-bits 컴파일 환경에서는 구조체 중에서 가장 큰 멤버의 크기로 align 이 이루어진다는 군요..
Extra padding may be added to a structure by the compiler to meet alignment
requirements as long and pointer fields grow to 64 bits for LP64. For both the
SPARCV9 ABI and the amd64 ABI, all types of structures are aligned to at least the
size of the largest quantity within them.
align 은 해당 머신의 long 이나 pointer 의 크기를 기준으로 잡아 주는게 나을 것 같군요.
위에서 8-bytes padding 을 한다면, padding 은 5byte 를 넣어줘야 맞을 것 같네요.
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
모든 시스템에서
모든 시스템에서 동일한 구조체 사이즈가 되려면
윗분 처럼 5바이트 더 넣어줘야 겠군요..
답글 다신분들 감사합니다.
소스상에서 지시자를
소스상에서 지시자를 사용하는 것도 한 방법입니다.
---------
간디가 말한 우리를 파괴시키는 7가지 요소
첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스
이익추구를 위해서라면..
다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치
---------
간디가 말한 우리를 파괴시키는 7가지 요소
첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스
이익추구를 위해서라면..
다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치
그런데 사실 padding
그런데 사실 padding 문제 이외에도 endian 문제도 존재하기 때문에
차라리 구조체 padding은 운영체제 & 컴파일러에게 맡기고
입출력 및 전송시에는 serialize하여 해결하는 것이 나은 방법일 수 있습니다.
댓글 달기