개념 적인 malloc 과 array 방식의 차이점에 대한 질문 입니다.
글쓴이: air74 / 작성시간: 화, 2005/10/04 - 2:00오후
안녕하세요.
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 에 추가 */ }
두 가지 방식의 각각 장점이 무엇이 있을까요?
어떤 이유에서 장점이 있어 각각의 방식이 사용 되는 지 궁금 합니다.
그럼 많은 답변 바랍니다.
Forums:
음...
일단 떠오르는 것은
음.. 고수분들 답달아주세요~ ㅎㅎ
char buf[MAX]; 식으로 array 로 잡아놓는 것은... st
char buf[MAX]; 식으로 array 로 잡아놓는 것은... stack 에 위치하게 됩니다... 그냥 맨 위에 MAX 만큼의 크기로 할당되기 때문에... 별다른 비용이 들지 않구요...
하지만 malloc 은 heap 에 위치하는 충분히 큰 공간을 찾아서 할당하게 되고... 원하는 크기가 들어갈 수 있는 공간 등을 찾기 위한 비용(best fit, worst fit, first fit 등..)이 필요하게 되는걸로 알고 있습니다...
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...
http://mytears.org ~(~_~)~
나 한줄기 바람처럼..
[quote="정태영"]char buf[MAX]; 식으로 array 로
전역 변수인 경우 .data 섹션에 위치하게 되지 않나요?
[quote="정태"]char buf[MAX]; 식으로 array 로 잡
메모리 할당자에따라 malloc free 비용이 크게 차이가 나고
대체로 비용이 큰 반면
스택에 잡힌 배열 메모리는 스택 할당 해제시 스택포인터만 조절하면 되므로 비용이 거의 들어가지 않습니다
물론 전역으로 잡아놓은건 스택에 메모리를 잡지 않고
전역 메모리에 들어가서 , 종료하기전까지는
메모리 해제가 불가능합니다
승자는 자기보다 우월한 사람을 보면 존경심을 갖고 그로부터 배울 점을 찾지만 패자는 자기보다 우월한 사람을 만나면 질투심을 갖고 어디 구멍난 곳이 없는지 찾는다.
- 하비스
[quote="Anonymous"][quote="정태영"]char buf
그건 컴파일러 혹은 운영체제마다 다른게 아닌가요?
말씀 하신건 윈도우에 종속된 내용 같은데요?
승자는 자기보다 우월한 사람을 보면 존경심을 갖고 그로부터 배울 점을 찾지만 패자는 자기보다 우월한 사람을 만나면 질투심을 갖고 어디 구멍난 곳이 없는지 찾는다.
- 하비스
Re: 음...
배열도 스택 사이즈 제한 때문에 할당되지 않을 수 있습니다. malloc()은 반환값을
검사할 수 있지만 스택 오버플로우는 검사도 불가능하고 처음 당할 때는 원인을
알 수 없어 정말 황당하죠.
제 경험으로는 다음과 같습니다.stack에 잡는 경우:첫째.
제 경험으로는 다음과 같습니다.
stack에 잡는 경우:
첫째. 할당/해제에 드는 시간이 짧다 (거의 상수 C).
둘째. 할당 실패시, 안전하게 확인할 방법이 없다. (거의 stack overflow 형태).
세째, 시스템에 따라 많이 달라지지만, object size가 커 질 가능성도 있다.
네째, 표준에 따라 stack에 할당할 수 있는 크기는 제한될 수도 있다. (크게 중요하지 않음)
malloc/free를 쓰는 경우:
첫째, allocator에 따라 다르나, stack을 쓰는 것보다 할당/해제에 드는 시간이 길다.
둘째, 할당 실패시 안전하게 확인할 수 있다.
따라서 개인적으로, 상대적으로 크기가 작고 고정된 영역을 위해서는 stack을 쓰고, 크기가 크거나 정해지지 않은 공간이 필요할 경우 malloc/free를 씁니다.
예를 들어, strftime(3)을 위해 공간이 필요하다면 stack을 씁니다. 일정 크기 이상의 공간이 필요하지 않고, 별로 큰 공간을 필요로 하지 않기 때문에 stack에 지역 변수 형태로 선언합니다. 그러나, 사용자 또는 파일에서 한 줄을 읽어야 된다면, 이 공간은 malloc으로 잡습니다. 어느 정도로 커 질지 알 수가 없기 때문입니다.
물어보신 의도는 잘 모르겠지만, 가능하면 GNU alloca(3) 함수를 쓰는 법도 읽어 두시면 도움이 될 거라고 생각됩니다.
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
메모리가 상대적으로 많고, 동적인 처리가 요구되는 시스템의 경우 mall
메모리가 상대적으로 많고, 동적인 처리가 요구되는 시스템의 경우 malloc을 사용하여 코딩하기도 하고,
정적인 시스템 및 주요시스템(임베디드시스템, 특정 작업을 수행하는 서버)등에서는 정적으로 코딩합니다.
댓글 달기