.

newlibty의 이미지
M.W.Park의 이미지

alignment를 말씀 하시는 것같은데요.
기본 컴파일러 설정에서 달라질 수도 있고, pack같은 컴파일러 지시자(?)에 의해서 달라질 수도 있습니다.
http://en.wikipedia.org/wiki/Data_structure_alignment

-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

토끼아빠의 이미지

저도 1020이 나와야 한다고 생각했는데 실지 해보니 1024가 나오네요...
그런데 다음과 같이 struct를 만들어주면 1020이 나오는군요..

typedef struct Packet_t
{
	int a;	
	int c;
	unsigned short b;
	unsigned short d;
	char e[1008];
}Packet;

원인은 알수 없음.
여러 고수님들께 부탁 한마디!

좋은 하루 되세요!!

좋은 하루 되세요!!

rhheo의 이미지

M.W.Park님의 말씀대로
alignment의 문제입니다.

결론부터 말씀드리자면 해당 플렛폼의 컴파일러에 따라서,
그리고 컴파일 옵션, 컴파일 지시자에 따라서 결과는 달라질 겁니다.

결과가 달라지는 이유는 이렇습니다.
각 플렛폼 별로
한번에 메모리에서 cpu로 가져오는 데이터 크기도 다르고
메모리의 번지를 지정하는 방법도 데이터 타입별로 틀려지기 때문입니다.

즉 최대한의 성능을 내야하고
최대한 빈 공간을 없애면서
저장하는 것이 목적으로 해야합니다.

하드웨어에 최대한 독립적으로 C언어를 유지하기 위해서
구조체를 어떻게 메모리에 저장할 것인 가는
컴파일러에 맞길 수 밖에 없는 것입니다.

문제가 되는 예를 들어 보면 먼가 느껴지실 겁니다.
한번에 4바이트씩 처리하는 플렛폼에서

char a
char b
int c
로 구성된 구조체를 한번 생각해 봅니다.

만약 1, 1, 4 바이트를 연속으로 메모리에 저장하면
첫번째 번지가 1000번지라고 하면
cpu가 메모리에서 데이터를 가져오는 방식(어드레싱)은
아래와 같이 됩니다. (배열과 흡사합니다)

a는 (char)1000[0]이 됩니다. -> 1000번지
b는 (char)1000[1]이 됩니다. -> 1001번지
c는...? (int)1000[2]로 하게 되면
 -> 1008번지가 되므로
 (int)1000[0]의 하위 2바이트와 (int)1000[1]의 상위 2바이트를
 붙여야하는 오버헤드가 발생합니다.

결과적으로
1, 1 바이트 다음에 2바이트를 넣어둠으로 써
c를 (int)1000[1]와 같이 접근 할 수 있게 하면
최대한의 성능과
메모리 절약의 상충점이 되는 겁니다.

물론 다음과 같이 최악의 경우
구조체를 배열로 한다던지 해야 할 경우에는
성능을 포기하고 빈칸을 안 넣게 해야 할 경우가 생길 수도 있습니다.
(비추천이지만... 메모리가 정말 부족하다면...)

char
double
char

의 구조체 결과

char -> 1
빈칸 -> 7
double -> 8
char -> 1
빈칸 -> 7

즉 10바이트의 정보를 저장하는데 24바이트가 필요해 집니다.

여튼... newlibty님께서 그리신 그림은 맞는 그림이고요.
구조체명이 Packet인데..
통신에 사용하실 예정이시면 구조체를 통체로 보내면 문제가 생길 수도 있을 겁니다.

이상.. 도움이 되셨기를...
틀린 내용이 있다면 한 수 부탁드립니다 m(__)m

appler의 이미지

마지막에 24가 아니라 16아닌가요??

32비트 운영체제라면요...^_^

char - 1 byte
double - 8 byte
char - 1 byte

32비트면 4byte가 기본이니깐

1 바이트 패딩은 3바이트

8바이트는 패스~

다시 1 바이트는 패딩 3바이트 해서

1 + 3 + 8 + 1 + 3 = 16

16아닌가요?

아니라면 다시 자세한 설명좀...ㅎㅎ;


laziness, impatience, hubris

不恥下問 - 진정으로 대화를 원하면 겸손하게 모르는 것은 모른다고 말하는 용기가 필요하다.


laziness, impatience, hubris

不恥下問 - 진정으로 대화를 원하면 겸손하게 모르는 것은 모른다고 말하는 용기가 필요하다.

rhheo의 이미지

char a
double b
char c

마찬가지로 1000번지에 저장되었다고 하면요

a = (char)1000[0]
b = (double)1000[1] <- 여기를 맞춰주려면 a다음에 7바이트를 넣어 줘야 겠죠.
c = (char)1000[16]
c 다음에는 가장 큰 타입에 맞게 패딩을 넣어 줘야 하므로 7바이트...

이렇게 되어서
1 + 7 + 8 + 1 + 7 = 24

24가 될 것 같습니다.

추기. 실제로 해보니 24나오네요 :)

rhheo의 이미지

구조체의 경우
구조체 내부의 요소에 접근하기 위해

(구조체베이스 주소 + 해당 요소의 오프셋)로 요소의 주소를 구할 수도 있겠습니다만

배열인 것 처럼 해서
(배열의 첫번째 주소 + 배열 인덱스*요소의 크기)로 주소를 구하는 방법이
성능면에서 더 좋기 때문에 (명령어에 따라서 2배까지 차이가 남) 이 방법을 사용하기 위해 패딩을 하는 것입니다.

appler의 이미지

오호 2배나 차이가 나는군요......

좋은 정보 감사.ㅎㅎ

패딩 괜히 하는게 아니군요...

역시나 모든 움직임은 차후에 쓰임을 극대화 하기 위한 전략과 법칙이군요.


laziness, impatience, hubris

不恥下問 - 진정으로 대화를 원하면 겸손하게 모르는 것은 모른다고 말하는 용기가 필요하다.


laziness, impatience, hubris

不恥下問 - 진정으로 대화를 원하면 겸손하게 모르는 것은 모른다고 말하는 용기가 필요하다.

댓글 달기

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