변수선언 할때마다 malloc을 해줘야하는게 정상?일까요?

호기심천국의 이미지

(C언어로 코딩하고 있습니다.)

그동안 malloc을 거의 안쓰고 코딩했는데, 문득 궁금해졌습니다.

변수 선언할 때 자동적으로 그 변수크기에 맞는 메모리를 할당한다고 생각했었는데요..

사실 변수 선언할때마다 아래처럼 malloc을 사용해 주는것이 정확할 것 같다는 생각이 드는데.. 제 생각이 맞을까요?
(저는 지금 아파치 프로그래밍을 하다보니 apr_palloc을 사용합니다)

아니면 포인터형 변수를 선언할때만 malloc을 해줘야하나요?

추가적으로 저같은 경우 char*형을 자주 쓰게되는데, 이 경우는 무조건 메모리 할당을 해줘야겠죠?

질문이 너무 많은것 같네요 ^^;;; 미리 답변 감사드립니다~!

struct NODE{
    char* key;
    char* value;
}
void delete_node(apr_pool_t* p, NODE* del_node, char* str){
    NODE* replace_node = (NODE*)apr_palloc(p, sizeof(NODE*));
    replace_node->key = (char*)apr_palloc(p, sizeof(char)*(strlen(str)+1));
    replace_node->key = str;
    /*
    int* x = (int*)apr_palloc(p, sizeof(int*));
    *x = 1
    */
}
shint의 이미지

제가 아는 방법은 이렇습니다.

- 성능 속도는 이렇습니다.
CUDA / GPGPU > AMP MMX SSE > PPL > 배열 > CAtlMap > Stl Port > MySQL?? > STL vector list queue deque

- 삭제하는 것은 느립니다.
- 생성을 반복하는것도 크기에 따라서. 속도가 낮아집니다.
- 재사용 (덮어 쓰기)가 빠릅니다.

성능을 향상 하시고 싶다면.
- 빠른 함수
- 빠른 컴퓨터 (CPU GPU HDD RAM SSD USB 등등)
- 빠른 알고리즘
- 여러대의 컴퓨터
- SQLite 를 입력 방식을 개선하면. 1000 배 이상 성능이 향상 된다고 합니다.
- USB 는 허브를 사용해서. 255 개 정도에 연결이 가능합니다.
- 양자 컴퓨터 (Q# 시뮬레이터도 나왔다고 하네요.)
- 슈퍼 컴퓨터
- 광 컴퓨터
- 그래픽 카드의 VPU 는 DXVA2 를 가속해줍니다. CPU 5 %로 3840 x 2160 해상도를 재생합니다.
- 윈도우10 장치로 캐스팅은 CPU 점유율 1%로 동영상 전송이 가능합니다.
- 012 값으로. 텍스트 문서 파일을 저장하고. LZMA (7zip WinZipX XZ) 알고리즘으로 압축하면. 1000 배 이상 압축이 가능합니다.
- 압축한 데이터를 연산하는 방법도 만들어진다면. 더 빠른 연산이 가능해 집니다.
- 1W 젯슨 그래픽 카드가 NVIDIA에 있습니다.
- Adreno 와 라즈베리 파이는 여러대를 함께 연결해서 사용이 가능하다고 합니다.
- 노트북 / 스마트폰 / TV 셋탑박스 등은 저전력입니다.
- 플스4 와 XBOX One 등은 테라 플롭스 '에 고성능 입니다.
- 일본에는 TCP 보다 30배 빠른 통신 방식이 있다고 합니다.

이런 방법이 있습니다.

윈도우 성능 향상 방법 + 오버클락
http://www.devpia.com/Maeul/Contents/Detail.aspx?BoardID=278&MAEULNo=20&no=32431&ref=32431

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

익명 사용자의 이미지

정상이니 비정상이니 하는 건 너무 강한 표현인 것 같습니다만, 개인적으로는 별로 권장하지 않습니다.

C++처럼 RAII를 쓸 수 있는 것도 아니고, Java처럼 GC가 있는 것도 아닌데, 할당된 메모리를 적절할 때 적절하게 해제해 주는 일 부담스럽지 않습니까?

물론 꼭 필요하면 할 수밖에 없고, 어떻게든 안전하고 편하게 하기 위한 노력도 지금까지 적잖이 있어 왔지만, 피할 수 있다면 피하는 게 제일이겠죠. 구태여 malloc을 더 많이 써서 얻는 이점이 무엇인가요?

익명 사용자의 이미지

> 사실 변수 선언할때마다 아래처럼 malloc을 사용해 주는것이 정확할 것 같다는 생각이 드는데.. 제 생각이 맞을까요?

아주 잘못된 생각입니다.

스택 메모리(즉, 지역 변수를 정의하면 할당되는 메모리)는
1) 할당한 함수가 리턴하면 해제됩니다.
2) 힐당 가능한 최대 크기가 시스템에 장착된 물리적 메모리 크기에 비해 아주 작습니다. 조정 가능하지만 보통 수 메가바이트 정도입니다.
3) 빠릅니다.

이에 반해 힙 메모리(malloc을 사용해 할당받는 메모리)는
1) 명시적으로 해제하기 전까지 유지됩니다.
2) 할당 가능한 최대 크기는 사실상 시스템에 장착된 물리적 메모리 크기에 의해서만 제한됩니다.
3) 스택 메모리에 비해 느립니다.

이런 특성을 고려해서 필요에 따라 사용하는 것이지 항상 어느 한쪽을 사용할 이유가 없습니다.

> 추가적으로 저같은 경우 char*형을 자주 쓰게되는데, 이 경우는 무조건 메모리 할당을 해줘야겠죠?

그렇지 않습니다. 스택에 할당할지 힙에 할당할지는 자료형과는 무관한 문제입니다.

> 아니면 포인터형 변수를 선언할때만 malloc을 해줘야하나요?

그렇지 않습니다. 포인터도 그냥 자료형의 하나입니다. 다시 말씀드리지만 자료형과는 무관합니다.

bushi의 이미지

NODE* replace_node = (NODE*)apr_palloc(p, sizeof(NODE*));
가 아니라
NODE* replace_node = (NODE*)apr_palloc(p, sizeof(NODE));
가 맞습니다.
NODE* replace_node 라는 (포인터)변수 자체는 delete_node() 라는 함수의 스택에 있고,
내용물(NODE)를 담을 메모리 공간을 할당하셔야죠.

replace_node->key = str;
이 아니라
strcpy(replace_node->key, str);
가 맞습니다.
자료형 (char*) 인 (포인터) 변수는 NODE 를 위한 메모리 공간에 이미 할당되어 있고,
그 내용물(char[])이 들어갈 메모리 공간을 할당하셨으니 이제 거기에 내용물을 채워야죠.

replace_node->key 가 가르키는 메모리 공간을 malloc 으로 할당받아야하냐 아니냐는 함수의 인자로 주어지는 str 이 가르키는 메모리 공간의 수명만 관련있습니다.
인자로 주어진 str 이 가르키는 메모리 공간의 수명이 영구적이라면,
replace_node->key = str;
처럼 같은 메모리 공간을 계속 가르키도록 해도 되겠죠.

포인터가 뭔지 아직 잘 모르시죠 ?

댓글 달기

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