[질문] 구조체 선언에서 __attribute__ ((packed)) 이게 먼지 궁

익명 사용자의 이미지

커널쪽 헤더에 보니까.

구조체 선언이...

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

라는 형식으로 되어있던데.

가장 마지막의 __attribute__ ((packed)); 멀 말하는지 모르겠네요..^^;;

아...역시 씨는 어렵군요...(ㅠ_ㅠ)

몇 년을 공부해야 득도할 수 있을까요...씨는...ㅠ_ㅠ

익명 사용자의 이미지

마이크로 프로세서에서 가장 비용이 많이 드는(expensive)
연산들 중 하나가 바로 메모리 접근입니다.
프로세서의 성능을 향상시키기 위해서는 메모리 접근을 최소화 해야
합니다.
그렇게 하기 위해서 메모리는 주소 지정을 할 때
항상 프로세서와 연결된 데이터 라인의 갯수만큼의
자료를 한번에 전송하도록 구성되어 있습니다.

요즈음 주로 사용하는 인텔의 32bit 프로세서들처럼
메모리와의 인터페이스에 32비트의 데이터라인을 사용할 경우,
프로세서가 읽고자 하는 데이터가 1 바이트인 경우에도
메모리의 어드레스 라인에 그 데이터의 주소를 지정해 주면
인접한 4 개의 주소공간의 값까지 함께 올라오게 됩니다.
예를 들어서,
0005h 번지에 있는 한 바이트를 프로세서가 읽고자 해서
어드레스 라인에 0005h 의 값을 주고서
메모리의 READ ENABLE 단자에 신호를 주더라도
0004h, 0005h, 0006h, 0007h 에 저장되어 있는 값까지
한번에 데이터 라인에 실리게 되는 것입니다.
만약, 읽고자 하는 데이터가 4 바이트이며,
운좋게도 이것들이 모두 연속된 주소공간에 있으며,
또한, 위의 예처럼 0004h 부터 저장되어 있다면,
일일이 4 번의 소모적인 메모리 접근을 하지 않고서도
한번에 4 바이트를 모두 읽을 수 있게 됩니다.
즉, 프로세서의 수행 성능을 보다 좋게 할 수 있게 됩니다.

컴파일러도 마찬가지입니다. 이러한 프로세서와 메모리의
특성을 활용해서 스스로 데이터를 메모리에 저장할 때
프로세서가 가장 효율적으로 처리할 수 있도록 나름대로
데이터가 저장되는 메모리의 위치를 조정하게 됩니다.

그렇기 때문에 구조체를 쓰다 보면,
CPU 가 메모리를 읽고 쓰는 단위로 인해서 빈 공간이 생깁니다.
예를 들어, 우리가 주로 사용하는 인텔의 32bit CPU 는
4바이트(32비트) 단위로 메모리를 읽고 씁니다.
따라서, 한번의 메모리 접근 사이클로 읽고 쓰는 단위는 4 바이트가
됩니다. 즉, 4개의 주소공간을 한번에 접근하는 것이죠.
이 속도를 보다 빠르게 하기 위해서
char 나 short 등의 자료형을 저장할 때에 주소가 4 로 나누어
떨어지는 곳에 저장을 하게 됩니다.

실제 예로써, 다음과 같은 구조체를 선언해서, 변수를 정의하면,

struct foo {
char a;
long b;
short c;
};

struct foo bar;

메모리에 다음과 같이 저장됩니다

+----------------+
| char a | 0000h
+----------------+
| | 0001h
+----------------+
| | 0002h
+----------------+
| | 0003h
+----------------+
| | 0004h
+ +
| | 0005h
+ long b +
| | 0006h
+ +
| | 0007h
+----------------+
| | 0008h
+ short c +
| | 0009h
+----------------+
| | 000ah
+----------------+
| | 000bh
+----------------+
| ..... | ....

그림에서 보시듯, 0001h, 0002h, 0003h 가 비게 되며,
실제 이 메모리 영역에 어떤 값이 들어갈지는 아무도 모릅니다
(0 으로 채워지나요? -_-a)
이것을 pack 이라는 컴파일러 지시자(?) 를 사용하여서
촘촘히 붙여서 저장되도록 만들어 주는 것입니다.

즉, 구조체 접근의 기본 단위를 지정하는 것.... 이라고나 할까요?

또한 pack() 에 들어가는 값들을 가지고 정렬되는 단위도 조정할 수 있습
니다.
자세한 것은 gcc 매뉴얼을 참조해 보세요.
또, alignment 와 관련된 내용도 검색해 보세요.

참...
최근에 gcc 말고 다른 컴파일러를 사용하느라 옵션이 좀 헷갈렸군요.
gcc 에서는 packed 지시자를 사용하게 되면,
가능한 최소의 alignment 를 이용해서 변수의 메모리를 조정하는군요.
char 에는 1 바이트, 비트 필드에는 1 비트 ... 이런식으로요..
url은,

http//gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_4.html#IDX299

입니다. 동 문서에서 packed 로 검색해 보시면 packed 에 관련된 내용도
나옵니다.

익명 사용자의 이미지

걱정마세요. 우리나라에 그런거 아는 사람 그리 많지 않습니다.
전부다 거의다가 뻥치기가 많아서리...ㅎㅎㅎ

__attribute__ ((packed)) 는 딴게 아니라 아랫분 말씀대로 4바이트 단위
로 정렬시키는 거랍니다.

그리고 __attribute__용법은 많습니다.

다시한번 말씀드리자면, 이거 제대로 아는 사람 별로 없어요.

이런 거 많이 알고 있으면 벌써 kldp에 올라와 있었을 겁니다.

익명 사용자의 이미지

우리나라 프로그래머 몇명이나 아십니까?
당신이 얼마나 많은 프로그래머들을 접해봤는지 몰라도
얼마나 실력이 뛰어난지 몰라도 이따위 글이나 올리라고 있는
게시판이 아닙니다.

모르면, 가만히 있으면 중간은 합니다.
괜히 자기얼굴에 침뱉는 행동으로 남까지 불쾌하게 만들지 맙시다.!!

익명 사용자의 이미지

__attribute__ ((packed)) 는 딴게 아니라 아랫분 말씀대로 4바이 트 단위
로 정렬시키는 거랍니다.

거꾸론데요? 4바이트 단위로 정렬시키는 것이 아니라
structure size를 5byte, 6byte, 7byte등 그 size에
딱 맞게(packed) 해 주는 겁니다.

제가 알기로는 portable하지 않기 때문에 되도록이면
사용하지 않는 것이 좋을 것 같습니다만..

익명 사용자의 이미지

용서하시길...
__attribute__의 사용법에 관하여 좀 많은 글 올려주시면 감솨하겟음당.
그리고 kldp에 문서화시켜주시면 상당히 감솨^^;

익명 사용자의 이미지

NULL

익명 사용자의 이미지

머냐.. 진짜 뻔뻔한 사람이네

댓글 달기

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