구조체의 사이즈가 예상하고 다르게 나옵니다.

shs0917의 이미지

struct node{
int a;
char b;
float c;
double d;
}

개별적인 사이즈를 sizeof로 알아보면
int 4byte, char 1byte, float 4byte, double 8byte
이렇게 정상적으로 나옵니다.

제가 예상하기로는 node의 크기는 a + b + c + d
즉 4 + 1 + 4 + 8 = 17byte 이렇게 생각했는데요..
실제로 소스 돌려보니까 20byte가 나옵니다.

참고로 테스트 환경은 레뎃 9.0이구요.. 커널은 2.4x버전...
gcc 2.9x 버전인가 그렇습니다. 이런 요소는 상관이 없는줄로 아는데..
혹시나 해서요.. 그리고.. 20byte로 나오는게 맞는건가요?
답변 부탁 드립니다.

struct node{
    int a;
    char b;
    float c;
    double d;
};

int main(void){
    printf("size: %d\n", sizeof(struct node));

    return 0;
}
hurryon의 이미지

padding 효과 때문에 그렇습니다. 본 게시판에 관련된 내용이 있는걸로 아는데 귀찮아도 검색해 보세요. :-)

shs0917의 이미지

아.. 죄송합니다.. 그러고 보니 제가 왜 검색을 안했는지..
제가 무례한 질문을 올렸네요.. 죄송합니다..
그럼에도 불구하고 답변해 주신거 감사 드립니다.

컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러

shs0917의 이미지

패딩에 대해 잠깐동안 알아봤습니다.
4+1+4+8 = 17이 되어야 하지만 20이 된 이유를 생각해봤습니다.
저의 생각은 32bit 프로세서가 레지스터에 펫치하는 단위가 4byte이기
때문에 패딩을 할 때 패딩이 필요한 크기에서 가장 가까운 4의 정수배 바이트에
맞춰서 패딩을 하므로.. 1bye char를 +3byte해서 4byte로 패딩 시키면
총 크기는 17 + 3(패딩 사이즈) = 20이 되기 때문에 구조체의 사이즈는 20이
되는거 같습니다. 또 하나, 윈도우 환경에서 VC++6.0으로 컴파일 했을 경우
20이 아니라 24라는 결과를 얻을 수 있었습니다. 그 이유를 또 나름대로
분석을 해봤습니다. 제 나름대로의 결론은 현재 구조체 안에서 4의 정수배를
가지는 가장 큰 것이 8byte인 double형이므로 이번 경우에는 가장 큰놈에게
맞춰서 패딩을 한거 같습니다. 따라서 1byte에 7byte가 더해져서..
17 + 7은 24byte가 되는 이런 현상이 일어난거라고 사료되는군요..
그러므로 패딩 사이즈는 프로세서의 어드레싱 단위에 의존적이면서.. 같은
프로세서 환경이라도 컴파일러에 의존적이 되는것이라고 저는 결론 지었는데요
과연 저의 분석이 맞는 것인지 좀 검토해주시면 감사하겠습니다.

컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러

kslee80의 이미지

#include <stdio.h>

typedef struct {
        int a;
        char b;
        char c;
} st_1;

typedef struct {
        char b;
        int a;
        char c;
} st_2;

int main()
{
        printf("st_1 = %d, st_2 = %d\n", sizeof(st_1), sizeof(st_2));

        return 0;
}

두개의 struct 인 st_1 과 st_2 는 구성 맴버가 같죠;
그러나, 실행결과는 이렇게 나옵니다.

Quote:
st_1 = 8, st_2 = 12

alignment 에 대해서도 찾아보세요..
struct 의 크기 문제는 alignment 에 의한 결과라고 이야기 하는게 맞습니다.

shs0917의 이미지

아하.. 그렇군요.. :oops: 실제로 코딩을 하면서 이런걸 자세히
생각해본적이 없는데.. 아주 중요하단 생각이 들어서 좀 자세히
알아보고 싶었던 것인데.. alignment에 대한것이 있었군요..
빨리 테스트 해보고 분석 해봐야 겠습니다..

컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러

shs0917의 이미지

Quote:

st_1 = 8, st_2 = 12

이렇게 되는 이유를 생각해봤습니다.
st_1의 경우
|--4byte--|
[C][C][PP]
[---INT----]
이런 모양으로 패딩이 되기 때문에 8byte로 되고

st_2의 경우
|---4byte---|
[C][P][P][P]
[----INT----]
[C][P][P][P]
이런 모양으로 패딩이 되기 때문에 12byte가 되는군요..
alginment라는걸 그림을 그려보니 쉽게 이해가 되더라구요..
답변 주신 분들 감사 드립니다.

컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.