[완료] padding 에 대해서..

1
point

책에서 보니

보통 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;

haze11의 이미지
1507
points

struct a { ....

1
point

struct a {
....
} __attribute__ ((packed));

딱 맞춰서 하고싶으면 이런 방법도.. =.=

JuEUS-U의 이미지
5087
points

정말로 16이로군요

1
point

정말로 16이로군요 =ㅅ=)...
솔라리스... 오묘하군요...

음...

2
points

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 』

모든 시스템에서

2
points

모든 시스템에서 동일한 구조체 사이즈가 되려면

윗분 처럼 5바이트 더 넣어줘야 겠군요..

답글 다신분들 감사합니다.

IsExist의 이미지
4754
points

소스상에서 지시자를

4
points

소스상에서 지시자를 사용하는 것도 한 방법입니다.

#pragma pack(4)

---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

eungkyu의 이미지
2625
points

그런데 사실 padding

3
points

그런데 사실 padding 문제 이외에도 endian 문제도 존재하기 때문에
차라리 구조체 padding은 운영체제 & 컴파일러에게 맡기고
입출력 및 전송시에는 serialize하여 해결하는 것이 나은 방법일 수 있습니다.

댓글 보기 옵션

원하시는 댓글 전시 방법을 선택한 다음 "설정 저장"을 누르셔서 적용하십시오.