[C++]메모리 할당에 대해서 궁금합니다.

assa의 이미지

메모리할당. 관리에 대해서 궁금한 점이 있습니다.

예를 들어서.

map< string, string > tmap1; // 전역변수;

void Function(){
  map< string, string > tmap2;

  for(){
    tmap2에 값을 넣기;
  }

  tmap1= tmpa2;
}

void Function1(){
  map< string, string > tmap1;

  tmap1= Function2();
}

map<string, string> Function2(){
  map< string, string > tmap2;

  for(){
    tmap2에 값을 넣기;
  }

  return tmap2;
}

이 둘 중에서 어떤 것이 메모리관리에 효율적인가요?

자세한 것을 몰라서 질문 드립니다..

그리고, c++의 메모리를 관리하는데 도움될 만한 책 추천도 부탁드립니다.

doldori의 이미지

일단 tmap2에 값을 넣고 tmap1에 복사하는 것보다는 그냥 tmap1에 직접 값을
넣는 것이 좋겠고요. 아마 이것은 즉흥적으로 코드를 만들다 보니 그렇게 된 것이고,
어쨌든 복사가 필요하다고 가정하겠습니다.

이 문제는 메모리 할당과도 관계가 있지만 근본적으로는 컨테이너의 복사가 몇 번
일어나는지가 관건입니다. 복사 생성과 대입은 차이가 있지만 복사라는 관점에서는
동일하다고 가정합시다.
첫번째 코드에서는 대입문에 의해 한번 복사됩니다.
두번째의 경우는
tmap2 --> Function2()가 반환하는 임시 개체 (복사 생성자)
임시 개체 --> tmap1 대입 (대입 연산자)
에 의해 두 번 일어납니다. 따라서 첫번째 코드가 더 효율적이라고 볼 수 있습니다.
두번째 코드를

void Function1(){ 
  map< string, string > tmap1(Function2()); 
}

로 약간 바꾸면 얘기가 또 달라지는데, 이 경우에는 컴파일러의 최적화에 따라
tmap1에 Function2()의 반환값을 직접 생성하는 최적화를 쓰면 한번만 복사가
됩니다. 이를 RVO(return value optimization)이라고 합니다. 물론 RVO는
컴파일러의 품질에 달린 것이어서 항상 그런 최적화가 일어나리라고 기대할 수는
없습니다.

메모리 관리를 중점적으로 다룬 책이 있는지는 모르겠고 (More) Effective C++이나
(More) Exceptional C++, Exceptional C++ Style 등에 조금씩 나와 있습니다.

assa의 이미지

60M짜리 파일을 map으로 자료를 집어 넣는데 메모리를 10배 가까이 먹는 바

람에 소스 수정이 불가피했었는데..

돌도리님 설명을 참고로 수정할 수 있을 것 같습니다..

고맙습니다.

댓글 달기

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