[C++]메모리 할당에 대해서 궁금합니다.
글쓴이: assa / 작성시간: 화, 2005/08/16 - 2:25오후
메모리할당. 관리에 대해서 궁금한 점이 있습니다.
예를 들어서.
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++의 메모리를 관리하는데 도움될 만한 책 추천도 부탁드립니다.
Forums:
일단 tmap2에 값을 넣고 tmap1에 복사하는 것보다는 그냥 tmap
일단 tmap2에 값을 넣고 tmap1에 복사하는 것보다는 그냥 tmap1에 직접 값을
넣는 것이 좋겠고요. 아마 이것은 즉흥적으로 코드를 만들다 보니 그렇게 된 것이고,
어쨌든 복사가 필요하다고 가정하겠습니다.
이 문제는 메모리 할당과도 관계가 있지만 근본적으로는 컨테이너의 복사가 몇 번
일어나는지가 관건입니다. 복사 생성과 대입은 차이가 있지만 복사라는 관점에서는
동일하다고 가정합시다.
첫번째 코드에서는 대입문에 의해 한번 복사됩니다.
두번째의 경우는
tmap2 --> Function2()가 반환하는 임시 개체 (복사 생성자)
임시 개체 --> tmap1 대입 (대입 연산자)
에 의해 두 번 일어납니다. 따라서 첫번째 코드가 더 효율적이라고 볼 수 있습니다.
두번째 코드를
로 약간 바꾸면 얘기가 또 달라지는데, 이 경우에는 컴파일러의 최적화에 따라
tmap1에 Function2()의 반환값을 직접 생성하는 최적화를 쓰면 한번만 복사가
됩니다. 이를 RVO(return value optimization)이라고 합니다. 물론 RVO는
컴파일러의 품질에 달린 것이어서 항상 그런 최적화가 일어나리라고 기대할 수는
없습니다.
메모리 관리를 중점적으로 다룬 책이 있는지는 모르겠고 (More) Effective C++이나
(More) Exceptional C++, Exceptional C++ Style 등에 조금씩 나와 있습니다.
아... 답변 고맙습니다.
60M짜리 파일을 map으로 자료를 집어 넣는데 메모리를 10배 가까이 먹는 바
람에 소스 수정이 불가피했었는데..
돌도리님 설명을 참고로 수정할 수 있을 것 같습니다..
고맙습니다.
댓글 달기