[완료]STL의 전역성/지역성 문제 - 함수안에서 선언한 vector가 함수종료후에도 살아있는가.
글쓴이: cococo / 작성시간: 금, 2009/07/24 - 1:10오후
요약질문대로입니다. 책보다가 몰라서 질문 올려 봅니다.
"Accelerated C++" 의 예제중 하나인데요.
vector<Student_info> extract_fails(vector<Student_info> &students ) { vector<Student_info> pass, fail; for (vector<Student_info>:: size_type i = 0; i != students.size(); i++ ) if ( ... ) fail.push_back( students[i] ); else pass.push_back( students[i] ); students = pass; return fail; }
보시면 아시겠지만, 맨 마지막 문장이
return fail;
인데, 이 fail은 extract_fails()에서 만들어 진 거잖아요?
그런데도 return으로 넘긴다는 건,
1. vector( 혹은 STL전부가 ) 어디에서 선언되건, 일단 선언된 후에는 프로그램( 함수가 아닌 )이 종료될 때까지 메모리에 남아있는단 뜻인가요? 마치 전역변수나 static처럼요...
2. 아니면 vector( 혹은 STL전부가 ) 는 "자신이 가지고 있는 값이 어느정도 크기인가에 관계없이 " vector 안의 모든 값을 call by value했을 때처럼 모조리 복사로 넘긴단 소리인가요? 이 경우 데이터 구조를 유지하기 위한 포인터 값도 알아서 조정된단 소리인가요? 제 머리론 이해가 안 됩니다만...
3. 템플릿 자체가 내부적으로 return의 경우 알아서 해당 자료구조의 데이터 값을 넘길 수 있도록 컴파일러나 라이브러리 레벨에서 준비되어 있는건가요?
일단 제가 가진 상식에서는 1이 그나마 가장 이해가 쉽습니다만.... 해답을 아시는 분들께서는 자비로운 답변 부탁드립니다.
그럼 좋은 하루 되세요.
Forums:
return type이 포인터가 아닌 이상 복사됩니다.
그리고 복사 연산은 역시 복사연산자에서 정의하고 있는 내용대로 할 것이므로 내부의 자료구조 문제는 신경쓸 이유가 없습니다. (직접 만든다면 신경 써줘야 합니다만 STL이므로 이 부분은 다 알아서 구현되어 있습니다)
그렇군요.
답변 감사드립니다.
행복은 희생없이는 얻을 수 없는 것인가?
시대는 불행없이는 넘을 수 없는 것인가?
accelerated c++을 본지는 오래 됬지만
어떤 걸 설명하려고 저 예제코드가 나왔는지 잘 모르겠습니다만, 질문에 답변을 드리자면
2번 입니다. 어찌됬건 함수의 선언 자체가 return value type이 vector이고 이 것은
말씀하신대로 copy가 일어납니다.
vector students, fails ;
...
...
fails= extract_fails(students) ;
결국 fails= fail ; 과 마찬가지가 되므로 vector::operator=() 가 호출 될 것이고 미리 정의된
이 할당 연산자가 적절히 vector를 복사 하겠지요.
'이 경우 데이터 구조를 유지하기 위한 포인터 값도 알아서 조정된단 소리인가요?' 이 질문이 뭔가
핵심인 것 같은데 감이 잘 오질 않습니다.
어쨌거나 정리하자면,
1. 리턴시 복사가 일어난다.
2. 말 그대로 복사, 즉 함수에서 선언된 vector fail에 있는 값들은 온전히 fails에 복사된다.
callee의 fail과 caller의 fails는 완전히 별개의 vector로 프로세스 메모리 공간에 각각 존재한다.
정도가 되겠네요. 그럼 이만...
답변 고맙습니다.
깜빡잊고 제목을 안 바꾸었더니, 다른 분이 답변을 추가로 달아 주셨네요. 신경써 주신 것 감사드립니다.
참고로 '이 경우 데이터 구조를 유지하기 위한 포인터 값도 알아서 조정된단 소리인가요?' <- 자료구조가 있다면 포인터로 값을 가리킬테니까... 라는 의미입니다.
행복은 희생없이는 얻을 수 없는 것인가?
시대는 불행없이는 넘을 수 없는 것인가?
댓글 달기