[완료] padding 에 대해서..

semtul79의 이미지

책에서 보니

보통 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의 이미지

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

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

JuEUS-U의 이미지

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

ymir의 이미지

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 』

semtul79의 이미지

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

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

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

IsExist의 이미지

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

#pragma pack(4)

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

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

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

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

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

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

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

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

eungkyu의 이미지

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

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.