다음 두개의 구조체의 크기가 다릅니다.

gsong의 이미지

typedef struct
{
    int             num_data1;
    char           str_data1[20];
    char            str_data2[14];
    int             num_data2;
    char            str_data3[14];
} t_data1;

typedef struct
{
    int             num_data1;
    int             num_data2;
    char           str_data1[20];
    char            str_data2[14];
    char            str_data3[14];
} t_data2;

위 의 두 개의 구조체를 sizeof() 해서 찍어보면 크기다 다르게 나옵니다.
둘다 56 이어야 되지만, t_data1 의 경우는 크기가 60이 나옵니다.
주소 값을 찍어 확인 을 해보니 str_data2 와 str_data3 뒤에 2바이트씩 더 붙는 것 같습니다.

아마 int 변수 때문인 것 같습니다만,
누가 자세히 설명 좀 해주셨으면 감사하겠습니다

ydongyol의 이미지

typedef struct 
{ 
    int             num_data1;          //4
    char           str_data1[20];      //20
    char            str_data2[14];     //14 ->16
    int             num_data2;           //4
    char            str_data3[14];      //14 ->16
} t_data1;                                   // 56 ->60

typedef struct 
{ 
    int             num_data1;          //4
    int             num_data2;          //4
    char           str_data1[20];     //20
    char            str_data2[14];    //14
    char            str_data3[14];     //14
} t_data2;                                 // 56    

32비트 환경에서는 한번에 4바이트씩 처리하므로 성능향상을 위해서 컴파일러가 임의로 구조체를 변경시킨듯합니다..
즉 가운데 낀 t_data1의 int um_data2 를 메모리에서 한큐에 읽을수 있도록 자리조정을 한듯 생각됩니다.
그리고 뒤에 붙은 2바이트는 58이되느니 메모리도 많이 남으로 60으로 하는게 성능향상에 도움될꺼라 컴파일러가 생각했는가 봅니다.. 막연히 최적화 옵션을 조정하면 바꿜꺼라 생각되네요..
추가로 어셈으로 임베디드 16비트 환경에서 변수잡을때 8비트는 아무번지에나 넣을수 있었지만, 16비트 워드형을 넣을때는 꼭 짝수번지에 넣어줘야 했었습니다...

--
Linux강국 KOREA
http://ydongyol.tistory.com/

elecguy의 이미지

컴파일러 기본옵션에서 구조체는 일반적으로 4바이트 정렬이 되고
또한 int 타입 역시 4의 배수(sizeof(int)) 에 되는 주소에 위치해야되므로 그렇게 나옵니다.
str_data2, str_data3 를 16바이트로해도 같은 크기가 나옵니다.
컴파일러(gcc) 옵션중 정렬에 대한 것이 있습니다. gcc 메뉴얼을 읽어보세요.

폐인, 노가다 그 끝은..?

체스맨의 이미지

구조체 정렬은 성능 향상 및 특정 시스템에서 bus error 를 피하기 위해 행해집니다.

32비트 시스템이라해도 항상 4바이트로 정렬되는 것은 아니고 most restrictive size 에 의해 행해집니다. 단지, 지금 말씀하신 예에서 most restrictive size 는 sizeof(int) 입니다. 예를들어 short 나 double 이 그것이 될 수도 있습니다.

구조체 정렬의 가장 기본 원리는, n바이트 크기를 갖는 멤버는 n 배수 주소상에 배치된다는 것입니다. num_data2 가 4바이트 이므로, 4배수 주소상에 배치되려면 예로 드신 처음 구조체에서 str_data2 뒤에 2바이트의 padded bytes 가 삽입되게 되죠.

덧붙여, 이런 규칙으로 인해, 이진데이터를 파일로부터 읽어들이거나, 이기종간에 이진데이터를 네트워크로 전송할 때, 바이트오더와 함께 구조체 정렬도 세심히 고려되어야 합니다.

Orion Project : http://orionids.org

ihavnoid의 이미지

정 padding이 싫으시면 packed 옵션을 붙여주면 됩니다.

typedef struct
{
  unsigned short int a;
  unsigned short int b;
  unsigned long      c;
  unsigned short int d;
  unsigned short int e;
  unsigned short int f;
} TEST_T __attribute__ ((packed));

그대신 속도가 느려지는 것은 각오해야겠죠.

Consider the ravens: for they neither sow nor reap; which neither have storehouse nor barn; and God feedeth them: how much more are ye better than the fowls?
Luke 12:24

pynoos의 이미지

#pragma pack(1)
typedef struct
{
    int             num_data1;
    char           str_data1[20];
    char            str_data2[14];
    int             num_data2;
    char            str_data3[14];
} t_data1;

typedef struct
{
    int             num_data1;
    int             num_data2;
    char           str_data1[20];
    char            str_data2[14];
    char            str_data3[14];
} t_data2;
#pragma pack()

이렇게 하면 거의 모든 컴파일러에서 잘 됩니다. 아마 HPUX 10 gcc 2.95 에서는 윗분처럼하는것만 되던 경험이 있습니다.

cinsk의 이미지

ISO C 표준을 보시면, struct 또는 union의 크기가 그 member들의 크기와 같다는 보장을 할 수 없다고 나옵니다.

댓글 달기

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