개념 적인 malloc 과 array 방식의 차이점에 대한 질문 입니다.

air74의 이미지

안녕하세요.

array 를 이용하여 스태틱하게 메모리를 사용하는 방법과 필요에 따라 malloc 을 이용하여 다이나믹 하게 메모리를 사용하는 방법의 장단점에 대하여 궁금 합니다.

ex1 -> array를 이용한 static 방법 

struct test_instance{
   test_t test_element[MAX_TEST_SIZE]; /* MAX 사이즈만큼 미리 잡아 놓는다 */
}

ex2 -> malloc을 이용한 dynamic 방법

struct test_instance{
   list *test_element; /* 필요에 따라 alloc 후 list 에 추가 */
}
 

두 가지 방식의 각각 장점이 무엇이 있을까요?
어떤 이유에서 장점이 있어 각각의 방식이 사용 되는 지 궁금 합니다.

그럼 많은 답변 바랍니다.

lacovnk의 이미지

일단 떠오르는 것은

Quote:
1. array
+해제를 신경안써도된다
+구조체 통째로 저장했다 불러올 수 있다

- MAX이상은 불가능하다
- 낭비의 요인이 될 수 있다

2. malloc
+ 자유로운, 필요한 크기만 사용 가능

- 해제해줘야 한다
- 할당되지 않을 수도 있다
- 통째로 저장할 수 없다

음.. 고수분들 답달아주세요~ ㅎㅎ

정태영의 이미지

char buf[MAX]; 식으로 array 로 잡아놓는 것은... stack 에 위치하게 됩니다... 그냥 맨 위에 MAX 만큼의 크기로 할당되기 때문에... 별다른 비용이 들지 않구요...

하지만 malloc 은 heap 에 위치하는 충분히 큰 공간을 찾아서 할당하게 되고... 원하는 크기가 들어갈 수 있는 공간 등을 찾기 위한 비용(best fit, worst fit, first fit 등..)이 필요하게 되는걸로 알고 있습니다...

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

익명 사용자의 이미지

정태영 wrote:
char buf[MAX]; 식으로 array 로 잡아놓는 것은... stack 에 위치하게 됩니다... ...

전역 변수인 경우 .data 섹션에 위치하게 되지 않나요?
mastercho의 이미지

정태 wrote:
char buf[MAX]; 식으로 array 로 잡아놓는 것은... stack 에 위치하게 됩니다... 그냥 맨 위에 MAX 만큼의 크기로 할당되기 때문에... 별다른 비용이 들지 않구요...

하지만 malloc 은 heap 에 위치하는 충분히 큰 공간을 찾아서 할당하게 되고... 원하는 크기가 들어갈 수 있는 공간 등을 찾기 위한 비용(best fit, worst fit, first fit 등..)이 필요하게 되는걸로 알고 있습니다...

메모리 할당자에따라 malloc free 비용이 크게 차이가 나고
대체로 비용이 큰 반면

스택에 잡힌 배열 메모리는 스택 할당 해제시 스택포인터만 조절하면 되므로 비용이 거의 들어가지 않습니다

물론 전역으로 잡아놓은건 스택에 메모리를 잡지 않고
전역 메모리에 들어가서 , 종료하기전까지는
메모리 해제가 불가능합니다

승자는 자기보다 우월한 사람을 보면 존경심을 갖고 그로부터 배울 점을 찾지만 패자는 자기보다 우월한 사람을 만나면 질투심을 갖고 어디 구멍난 곳이 없는지 찾는다.
- 하비스

mastercho의 이미지

Anonymous wrote:
정태영 wrote:
char buf[MAX]; 식으로 array 로 잡아놓는 것은... stack 에 위치하게 됩니다... ...

전역 변수인 경우 .data 섹션에 위치하게 되지 않나요?

그건 컴파일러 혹은 운영체제마다 다른게 아닌가요?

말씀 하신건 윈도우에 종속된 내용 같은데요?

승자는 자기보다 우월한 사람을 보면 존경심을 갖고 그로부터 배울 점을 찾지만 패자는 자기보다 우월한 사람을 만나면 질투심을 갖고 어디 구멍난 곳이 없는지 찾는다.
- 하비스

doldori의 이미지

lacovnk wrote:
2. malloc

- 할당되지 않을 수도 있다


배열도 스택 사이즈 제한 때문에 할당되지 않을 수 있습니다. malloc()은 반환값을
검사할 수 있지만 스택 오버플로우는 검사도 불가능하고 처음 당할 때는 원인을
알 수 없어 정말 황당하죠.
cinsk의 이미지

제 경험으로는 다음과 같습니다.

stack에 잡는 경우:
첫째. 할당/해제에 드는 시간이 짧다 (거의 상수 C).
둘째. 할당 실패시, 안전하게 확인할 방법이 없다. (거의 stack overflow 형태).
세째, 시스템에 따라 많이 달라지지만, object size가 커 질 가능성도 있다.
네째, 표준에 따라 stack에 할당할 수 있는 크기는 제한될 수도 있다. (크게 중요하지 않음)

malloc/free를 쓰는 경우:
첫째, allocator에 따라 다르나, stack을 쓰는 것보다 할당/해제에 드는 시간이 길다.
둘째, 할당 실패시 안전하게 확인할 수 있다.

따라서 개인적으로, 상대적으로 크기가 작고 고정된 영역을 위해서는 stack을 쓰고, 크기가 크거나 정해지지 않은 공간이 필요할 경우 malloc/free를 씁니다.

예를 들어, strftime(3)을 위해 공간이 필요하다면 stack을 씁니다. 일정 크기 이상의 공간이 필요하지 않고, 별로 큰 공간을 필요로 하지 않기 때문에 stack에 지역 변수 형태로 선언합니다. 그러나, 사용자 또는 파일에서 한 줄을 읽어야 된다면, 이 공간은 malloc으로 잡습니다. 어느 정도로 커 질지 알 수가 없기 때문입니다.

물어보신 의도는 잘 모르겠지만, 가능하면 GNU alloca(3) 함수를 쓰는 법도 읽어 두시면 도움이 될 거라고 생각됩니다.

익명 사용자의 이미지

메모리가 상대적으로 많고, 동적인 처리가 요구되는 시스템의 경우 malloc을 사용하여 코딩하기도 하고,
정적인 시스템 및 주요시스템(임베디드시스템, 특정 작업을 수행하는 서버)등에서는 정적으로 코딩합니다.

댓글 달기

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