[Modern C++] std::move, std::forward

2024. 6. 30. 19:26·Programming Language(Sub)/C++

추후 내용 보충. 예정

 

std::move와 std::forward는 모두 C++11 이후부터 도입된 유틸리티 함수들로, 둘 다 값의 전달 방식을 조절하는 데 사용됩니다. 그러나 각각의 역할과 사용하는 상황이 다르므로, 이 둘을 정확히 이해하는 것이 중요합니다.

std::move

역할: std::move는 주어진 인자를 "이동"할 수 있도록 하는 역할을 합니다. 이동(move)이란 객체의 자원(메모리 등)을 다른 객체로 옮기는 것을 말하며, 복사보다 효율적인 자원 관리를 가능하게 합니다.

사용 방법: std::move는 주로 객체를 이동할 때 사용됩니다. 이 함수는 주어진 인자를 rvalue reference로 변환하여, 이동 연산자(move constructor 또는 move assignment operator)를 호출할 수 있게 합니다.

예시:

#include <utility>
#include <vector>

int main() {
    std::vector<int> v1 = {1, 2, 3};
    std::vector<int> v2 = std::move(v1); // v1의 자원을 v2로 이동

    // 이제 v1은 비어 있음

    return 0;
}

std::forward

역할: std::forward는 주어진 인자를 "전달"할 때 사용됩니다. 전달(forward)이란 함수 템플릿의 매개변수를 다른 함수에 그대로 전달하는 것을 의미합니다. 이는 템플릿 매개변수의 형태를 유지하면서 완벽한 전달(forwarding)을 가능하게 합니다.

사용 방법: std::forward는 주로 forwarding reference (universal reference)를 사용할 때 유용합니다. forwarding reference는 T&& 형태의 매개변수로, 템플릿 매개변수의 형태를 유지하면서 왼값(lvalue)와 오른값(rvalue) 모두를 받을 수 있습니다.

예시:

#include <utility>

// 예시 함수 템플릿
template <typename T>
void wrapper(T&& arg) {
    some_function(std::forward<T>(arg)); // arg를 그대로 전달
}

int main() {
    int x = 42;
    wrapper(x); // 왼값 전달
    wrapper(123); // 오른값 전달

    return 0;
}

차이점 정리

  • std::move는 주로 이동 연산을 활성화시키기 위해 사용되며, 객체의 자원을 다른 객체로 이동시킵니다.
  • std::forward는 주로 forwarding reference를 다룰 때 사용되며, 완벽한 전달(forwarding)을 통해 함수 템플릿 매개변수의 형태를 유지하면서 인자를 전달합니다.

이 두 함수는 모두 템플릿 프로그래밍과 제네릭 프로그래밍에서 매우 중요한 역할을 합니다. 특히 이동 시맨틱과 퍼펙트 포워딩(perfect forwarding)에서 중요한 개념들입니다.

'Programming Language(Sub) > C++' 카테고리의 다른 글

[C++] stream(istream, ostream, sstream)과 stream insertion/extraction 연산자 (>>, <<)  (0) 2024.07.01
[C++] std::distance, std::advance  (0) 2024.07.01
[C++ STL] std::tuple  (0) 2024.06.30
[C++ STL] std::string  (0) 2024.06.30
[C++ STL] std::pair  (0) 2024.06.30
'Programming Language(Sub)/C++' 카테고리의 다른 글
  • [C++] stream(istream, ostream, sstream)과 stream insertion/extraction 연산자 (>>, <<)
  • [C++] std::distance, std::advance
  • [C++ STL] std::tuple
  • [C++ STL] std::string
lumana
lumana
배움을 나누는 공간 https://github.com/bebeis
  • lumana
    Brute force Study
    lumana
  • 전체
    오늘
    어제
    • 분류 전체보기 (456)
      • Software Development (27)
        • Performance (0)
        • TroubleShooting (1)
        • Refactoring (0)
        • Test (8)
        • Code Style, Convetion (0)
        • DDD (0)
        • Software Engineering (18)
      • Java (71)
        • Basic (5)
        • Core (21)
        • Collection (7)
        • 멀티스레드&동시성 (13)
        • IO, Network (8)
        • Reflection, Annotation (3)
        • Modern Java(8~) (12)
        • JVM (2)
      • Spring (53)
        • Framework (12)
        • MVC (23)
        • Transaction (3)
        • AOP (11)
        • Boot (0)
        • AI (0)
      • DB Access (1)
        • Jdbc (1)
        • JdbcTemplate (0)
        • JPA (14)
        • Spring Data JPA (0)
        • QueryDSL (0)
      • Computer Science (129)
        • Data Structure (27)
        • OS (14)
        • Database (10)
        • Network (21)
        • 컴퓨터구조 (5)
        • 시스템 프로그래밍 (23)
        • Algorithm (29)
      • HTTP (8)
      • Infra (1)
        • Docker (1)
      • 프로그래밍언어론 (15)
      • Programming Language(Sub) (77)
        • Kotlin (1)
        • Python (25)
        • C++ (51)
        • JavaScript (0)
      • FE (11)
        • HTML (1)
        • CSS (9)
        • React (0)
        • Application (1)
      • Unix_Linux (0)
        • Common (0)
      • PS (13)
        • BOJ (7)
        • Tip (3)
        • 프로그래머스 (0)
        • CodeForce (0)
      • Book Review (4)
        • Clean Code (4)
      • Math (3)
        • Linear Algebra (3)
      • AI (7)
        • DL (0)
        • ML (0)
        • DA (0)
        • Concepts (7)
      • 프리코스 (4)
      • Project Review (6)
      • LegacyPosts (11)
      • 모니터 (0)
      • Diary (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
lumana
[Modern C++] std::move, std::forward
상단으로

티스토리툴바