배열 선언 관련 질문

익명 사용자의 이미지

version1
int myarray[1000]={1,2,3,4};
void main(int argc,char *argv[])
{
  myarray[0]=3;
}

version2
int myarray[1000];
void main(int argc,char * argv[])
{
  myarray[0]=3;
}

실행 화일의 크기 비교
version 1 17657 byte
version 2 13629 byte

왜 이렇게 차이가 나는 걸까요?
두 프로그램 다 integer형의 배열이 1000개 만큼 잡히는 데요.
고수님들의 답변 기대합니다.

익명 사용자의 이미지

잘은 모르지만,
아마도 초기화 구문이 추가되어서 그러리라 생각됩니다.

어차피 C로 코딩하더라도 최후 결과물은 어셈블리를 통해
기계어로 번역되죠. 초기화 구문도 엄연히 명령어이고,
명령어 하나로 그 많은 배열에 각각 다른 값을 넣을 수 있는
명령어는 없는걸로 압니다. 당연히 초기화 하는 데 많은 코드가
소모될 수 밖에 없겠지요.

추측이었습니다만... )

익명 사용자의 이미지

좋은 호기심입니다...

우선.. 이 현상을 이해 할려면,, elf 바이너리의 특성을 알아야 합니다.

여기 가시면 elf 바이너리 스팩이 있습니다.
http//www.ezdoum.com/stories.php?story=02/04/08/1870532

간략히 말하면
int myarray[1000]={1,2,3,4}와
int myarray[1000] 는 바이너리에서 자리 잡는 곳이 틀립니다.

int myarray[1000]={1,2,3,4}는
14 .data 00000fc0 08049400 08049400 00000400 2**5
CONTENTS, ALLOC, LOAD, DATA
란 섹션에 자리를 잡게 되지요.. 즉.. 실행파일안에..
Contents of section .data
8049400 00000000 d0a30408 00000000 00000000 ................
8049410 00000000 00000000 00000000 00000000 ................
8049420 01000000 02000000 03000000 04000000 ................
8049430 00000000 00000000 00000000 00000000 ................
8049440 00000000 00000000 00000000 00000000 ................
8049450 00000000 00000000 00000000 00000000 ................
8049460 00000000 00000000 00000000 00000000 ................
8049470 00000000 00000000 00000000 00000000 ................
8049480 00000000 00000000 00000000 00000000 ................
8049490 00000000 00000000 00000000 00000000 ................
이런식으로 초기화된 값들이 들어있습니다.

하지만 int myarray[1000] 이녀석 같은 경우엔
초기화 되지 않았기 때문에 bbs 영역에 들어가게 되지요
20 .bss 00000018 0804a490 0804a490 00001490 2**2
ALLOC

bss 영역은 실행 파일에 포함되지 않고 단지 섹션헤더에
자신의 사이즈 정보를 가지고 있어서,,, 바이너리가
로딩될때 공간만 확보를 하게 되지요..


이것은 test1의 영역정보 요약입니다.
(int myarray[1000]={1,2,3,4})

13 .rodata 00000008 080483f8 080483f8 000003f8 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
14 .data 00000fc0 08049400 08049400 00000400 2**5
CONTENTS, ALLOC, LOAD, DATA
-> 보시면 data영역이 뒤에볼 test2보다 크게 잡혀있는게 보입니다.
15 .eh_frame 00000004 0804a3c0 0804a3c0 000013c0 2**2
CONTENTS, ALLOC, LOAD, DATA

19 .dynamic 000000a0 0804a3f0 0804a3f0 000013f0 2**2
CONTENTS, ALLOC, LOAD, DATA
20 .bss 00000018 0804a490 0804a490 00001490 2**2
ALLOC
-> 00001490이게 파일에서 옵셋포인터 인데, 다음 섹션인 stab의
옵셋이 00001490 으로 같은것을 볼수 있습니다. 바이너리가
로딩되었을때 사이즈만 가지고 있고 실제 파일에서는 아무것도
없는거죠..
21 .stab 00000750 00000000 00000000 00001490 2**2
CONTENTS, READONLY, DEBUGGING

13 .rodata 00000008 080483f8 080483f8 000003f8 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
14 .data 0000000c 08049400 08049400 00000400 2**2
CONTENTS, ALLOC, LOAD, DATA
-> test1과는 달리 초기화된 데이터가 아니라
int myarray[1000]; 선언을 했기 때문에 여기 사이즈가 작습니다.
15 .eh_frame 00000004 0804940c 0804940c 0000040c 2**2
CONTENTS, ALLOC, LOAD, DATA

19 .dynamic 000000a0 0804943c 0804943c 0000043c 2**2
CONTENTS, ALLOC, LOAD, DATA
20 .bss 00000fc0 080494e0 080494e0 000004e0 2**5
ALLOC
21 .stab 00000750 00000000 00000000 000004e0 2**2
CONTENTS, READONLY, DEBUGGING


test1 file format elf32-i386

Sections
Idx Name Size VMA LMA File off Algn
0 .interp 00000013 080480f4 080480f4 000000f4 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
1 .note.ABI-tag 00000020 08048108 08048108 00000108 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
2 .hash 0000002c 08048128 08048128 00000128 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
3 .dynsym 00000060 08048154 08048154 00000154 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
4 .dynstr 00000073 080481b4 080481b4 000001b4 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
5 .gnu.version 0000000c 08048228 08048228 00000228 2**1
CONTENTS, ALLOC, LOAD, READONLY, DATA
6 .gnu.version_r 00000020 08048234 08048234 00000234 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
7 .rel.got 00000008 08048254 08048254 00000254 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
8 .rel.plt 00000018 0804825c 0804825c 0000025c 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
9 .init 0000002f 08048274 08048274 00000274 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
10 .plt 00000040 080482a4 080482a4 000002a4 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
11 .text 000000ec 080482f0 080482f0 000002f0 2**4
CONTENTS, ALLOC, LOAD, READONLY, CODE
12 .fini 0000001a 080483dc 080483dc 000003dc 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
13 .rodata 00000008 080483f8 080483f8 000003f8 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
14 .data 00000fc0 08049400 08049400 00000400 2**5
CONTENTS, ALLOC, LOAD, DATA
15 .eh_frame 00000004 0804a3c0 0804a3c0 000013c0 2**2
CONTENTS, ALLOC, LOAD, DATA
16 .ctors 00000008 0804a3c4 0804a3c4 000013c4 2**2
CONTENTS, ALLOC, LOAD, DATA
17 .dtors 00000008 0804a3cc 0804a3cc 000013cc 2**2
CONTENTS, ALLOC, LOAD, DATA
18 .got 0000001c 0804a3d4 0804a3d4 000013d4 2**2
CONTENTS, ALLOC, LOAD, DATA
19 .dynamic 000000a0 0804a3f0 0804a3f0 000013f0 2**2
CONTENTS, ALLOC, LOAD, DATA
20 .bss 00000018 0804a490 0804a490 00001490 2**2
ALLOC
21 .stab 00000750 00000000 00000000 00001490 2**2
CONTENTS, READONLY, DEBUGGING
22 .stabstr 0000134f 00000000 00000000 00001be0 2**0
CONTENTS, READONLY, DEBUGGING
23 .comment 0000016e 00000000 00000000 00002f2f 2**0
CONTENTS, READONLY
24 .note 00000078 0804a4a8 0804a4a8 0000309d 2**0
CONTENTS, READONLY

test2 file format elf32-i386

Sections
Idx Name Size VMA LMA File off Algn
0 .interp 00000013 080480f4 080480f4 000000f4 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
1 .note.ABI-tag 00000020 08048108 08048108 00000108 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
2 .hash 0000002c 08048128 08048128 00000128 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
3 .dynsym 00000060 08048154 08048154 00000154 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
4 .dynstr 00000073 080481b4 080481b4 000001b4 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
5 .gnu.version 0000000c 08048228 08048228 00000228 2**1
CONTENTS, ALLOC, LOAD, READONLY, DATA
6 .gnu.version_r 00000020 08048234 08048234 00000234 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
7 .rel.got 00000008 08048254 08048254 00000254 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
8 .rel.plt 00000018 0804825c 0804825c 0000025c 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
9 .init 0000002f 08048274 08048274 00000274 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
10 .plt 00000040 080482a4 080482a4 000002a4 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
11 .text 000000ec 080482f0 080482f0 000002f0 2**4
CONTENTS, ALLOC, LOAD, READONLY, CODE
12 .fini 0000001a 080483dc 080483dc 000003dc 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
13 .rodata 00000008 080483f8 080483f8 000003f8 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
14 .data 0000000c 08049400 08049400 00000400 2**2
CONTENTS, ALLOC, LOAD, DATA
15 .eh_frame 00000004 0804940c 0804940c 0000040c 2**2
CONTENTS, ALLOC, LOAD, DATA
16 .ctors 00000008 08049410 08049410 00000410 2**2
CONTENTS, ALLOC, LOAD, DATA
17 .dtors 00000008 08049418 08049418 00000418 2**2
CONTENTS, ALLOC, LOAD, DATA
18 .got 0000001c 08049420 08049420 00000420 2**2
CONTENTS, ALLOC, LOAD, DATA
19 .dynamic 000000a0 0804943c 0804943c 0000043c 2**2
CONTENTS, ALLOC, LOAD, DATA
20 .bss 00000fc0 080494e0 080494e0 000004e0 2**5
ALLOC
21 .stab 00000750 00000000 00000000 000004e0 2**2
CONTENTS, READONLY, DEBUGGING
22 .stabstr 0000134f 00000000 00000000 00000c30 2**0
CONTENTS, READONLY, DEBUGGING
23 .comment 0000016e 00000000 00000000 00001f7f 2**0
CONTENTS, READONLY
24 .note 00000078 0804a4a0 0804a4a0 000020ed 2**0
CONTENTS, READONLY

ps. 더 자세히 공부하고 싶은 분은 아래의 책을 참고하세요 ^^
Linkers and Loaders
John R. Levine
http//www.wowbook.com/generic/book/info/book_detail.asp?isbn=ISBN1-55860-496-0

익명 사용자의 이미지

이제 확실히 알것 같습니다.
다시 한번 자세한 답변 감사 드립니다.

댓글 달기

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