C++로 프로그래밍할 때 인자 또는 리턴 값으로 std::vector 등 STL 데이터 타입 처리하는 좋은 방법
C++ 프로그래밍할 때 std::vector 등 STL 데이터 타입을 호출하는 함수로 넘겨주거나 받아야 할 경우가 있다. 이런 경우 메모리 문제 또는 속도 문제 때문에 고민을 많이 할 것 같은데, C++11 이상을 지원하는 컴파일러를 사용하는 분이라면 이 글에서 도움을 받아 가기 바란다.
함수 인자로 넘길 때
이 경우는 사용이 명확하다. Call by Reference으로 데이터를 넘기면 된다.
Call By Reference로 인자로 넘기는 방법은 pointer 를 사용해도 되지만, reference을 사용하는 것이 좋다.
void foo1(std::vector& data) { ... }
void foo2(std::vectorconst& data) { ... }
void foo3(std::vector data) { }
int main(int argc, char* argv[]) { std::vector my_data {10, 20, 30};
foo1(my_data); foo2(my_data); }
위 코드에서 foo1()과 foo2()는 Call by Reference로 값을 넘기는 반면에 foo3()는 Call by Value로 main()에서 my_data를 넘기게 된다.
foo1()의 data는 main()의 my_data를 참조(reference)하고 있어서 foo1()에서의 데이터 변경은 main()의 my_data에 영향을 주게 된다.
그리고 foo2()는 main()의 my_data를 참조는 하지만 수정을 할 수가 없는 것이라서 단순히 값만 참조할 수 있게 된다.
반면 foo3()에서의 data는 main()의 my_data를 넘기는 순간에 값을 복사하기 때문에 메모리가 증가하게 된다. 또한 foo3()에서 data를 수정하더라도 my_data에 영향을 주지 않는다.
함수에서 데이터로 받기 이 과정에서 개발자들은 많은 고민을 하게 된다. 다음 코드를 보자.
std::vector foo() { std::vect…
void foo1(std::vector& data) { ... }
void foo2(std::vectorconst& data) { ... }
void foo3(std::vector data) { }
int main(int argc, char* argv[]) { std::vector my_data {10, 20, 30};
foo1(my_data); foo2(my_data); }
위 코드에서 foo1()과 foo2()는 Call by Reference로 값을 넘기는 반면에 foo3()는 Call by Value로 main()에서 my_data를 넘기게 된다.
foo1()의 data는 main()의 my_data를 참조(reference)하고 있어서 foo1()에서의 데이터 변경은 main()의 my_data에 영향을 주게 된다.
그리고 foo2()는 main()의 my_data를 참조는 하지만 수정을 할 수가 없는 것이라서 단순히 값만 참조할 수 있게 된다.
반면 foo3()에서의 data는 main()의 my_data를 넘기는 순간에 값을 복사하기 때문에 메모리가 증가하게 된다. 또한 foo3()에서 data를 수정하더라도 my_data에 영향을 주지 않는다.
함수에서 데이터로 받기 이 과정에서 개발자들은 많은 고민을 하게 된다. 다음 코드를 보자.
std::vector foo() { std::vect…