[완료]STL의 전역성/지역성 문제 - 함수안에서 선언한 vector가 함수종료후에도 살아있는가.

cococo의 이미지

요약질문대로입니다. 책보다가 몰라서 질문 올려 봅니다.
"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이 그나마 가장 이해가 쉽습니다만.... 해답을 아시는 분들께서는 자비로운 답변 부탁드립니다.
그럼 좋은 하루 되세요.

grassman의 이미지

그리고 복사 연산은 역시 복사연산자에서 정의하고 있는 내용대로 할 것이므로 내부의 자료구조 문제는 신경쓸 이유가 없습니다. (직접 만든다면 신경 써줘야 합니다만 STL이므로 이 부분은 다 알아서 구현되어 있습니다)

cococo의 이미지

답변 감사드립니다.

행복은 희생없이는 얻을 수 없는 것인가?
시대는 불행없이는 넘을 수 없는 것인가?

antaran의 이미지

어떤 걸 설명하려고 저 예제코드가 나왔는지 잘 모르겠습니다만, 질문에 답변을 드리자면

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로 프로세스 메모리 공간에 각각 존재한다.

정도가 되겠네요. 그럼 이만...

cococo의 이미지

깜빡잊고 제목을 안 바꾸었더니, 다른 분이 답변을 추가로 달아 주셨네요. 신경써 주신 것 감사드립니다.

참고로 '이 경우 데이터 구조를 유지하기 위한 포인터 값도 알아서 조정된단 소리인가요?' <- 자료구조가 있다면 포인터로 값을 가리킬테니까... 라는 의미입니다.

행복은 희생없이는 얻을 수 없는 것인가?
시대는 불행없이는 넘을 수 없는 것인가?

댓글 달기

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