박오이님
무미건조한 개발자
박오이님
전체 방문자
오늘
어제
  • 뭥미 (101)
    • 프로젝트 (8)
      • 자가 보호 (3)
      • 주식 시장 분석 도구 (5)
    • 보안 (7)
      • 개론 (2)
      • 웹 (2)
      • 시스템 (2)
    • 개발 (69)
      • C++ (12)
      • Win32 (7)
      • MFC (2)
      • 자료구조 (8)
      • 알고리즘 (22)
      • 백준 (9)
      • 프로그래머스 (4)
      • LeetCode (0)
      • 개발자 면접 준비 (4)
      • OpenGL (1)
    • 서적 (13)
      • Effective C++ (9)
      • Effective Modern C++ (4)
    • 관심사 (4)
      • 재테크 (4)

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

태그

  • 합집합찾기
  • 나동빈
  • 개발
  • Functional
  • 코딩컨벤션
  • 시스템프로그래밍
  • 윈도우시스템프로그래밍
  • 프로세스메모리
  • C
  • 윈도우
  • CPP
  • vcpkg
  • JSON
  • 플로이드와샬알고리즘 #최단경로 #백준 #알고리즘 #개발 #C #C++
  • 안경잡이개발자
  • 윈도우개발자
  • 알고리즘
  • DFS #BFS #알고리즘 #프로그래밍 #코딩테스트 #코딩 #C++ #C
  • 에라토스테네스의 체 #알고리즘 #개발 #C #C++ #소수 #소수판별
  • 나동빈 #알고리즘 #동빈나
  • C++
  • 최소간선비용
  • 동빈나
  • 윈도우프로그래밍
  • std
  • 크루스칼알고리즘
  • 에라토스테네스의 체 #C #C++ #개발 #알고리즘 #BFS #DFS #백준 #백준알고리즘
  • 백준 #알고리즘 #플로이드와샬 #DFS #BFS #C #C++
  • jsoncpp
  • EffectiveC++

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
박오이님

무미건조한 개발자

개발/C++

std::move, std::forward

2023. 7. 25. 23:28

std::move와 std::forward는 C++11부터 제공되는 두 가지 유틸리티 함수로, 모두 C++ 템플릿 코드에서 유용하게 사용됩니다.

  1. std::move: std::move는 주어진 변수나 객체를 오른값 (R-value)으로 캐스팅하는 역할을 합니다. 이는 주로 객체의 소유권을 이전하거나, 복사 대신 이동(무효화된 객체를 재활용)하려는 상황에서 사용됩니다.
#include <utility>
#include <iostream>
#include <vector>

class MyClass {
public:
    MyClass() {
        std::cout << "Constructor" << std::endl;
    }

    MyClass(const MyClass&) {
        std::cout << "Copy Constructor" << std::endl;
    }

    MyClass(MyClass&&) {
        std::cout << "Move Constructor" << std::endl;
    }
};

int main() {
    MyClass obj1;
    std::vector<MyClass> vec;

    // 1. 복사 대신 이동 (Move) - obj1을 vec에 추가할 때, 복사 생성자가 아닌 이동 생성자가 호출됨.
    vec.push_back(std::move(obj1));

    // 2. obj1은 이동으로 인해 무효화됨. (이후 obj1을 사용하면 안 됨)
    // 이때, obj1은 그대로 남아있지만 무효화된 상태이므로 접근해서는 안 됨.

    return 0;
}

 

  1. std::forward: std::forward는 주로 함수 템플릿에서 발생하는 오른값/왼값 유지 문제를 해결하기 위해 사용됩니다. 템플릿 함수가 전달받은 인자를 다른 함수로 전달할 때, 해당 인자가 오른값일 때에는 오른값으로, 왼값일 때에는 왼값으로 전달하기 위한 용도입니다. 주로 함수 오버로딩이나 조건부 실행 등에 활용됩니다.
#include <utility>
#include <iostream>

void processValue(int& value) {
    std::cout << "L-value processed: " << value << std::endl;
}

void processValue(int&& value) {
    std::cout << "R-value processed: " << value << std::endl;
}

template <typename T>
void forwardValue(T&& value) {
    // std::forward를 사용하여 전달된 인자를 다음 함수로 전달하되,
    // 인자의 원래 타입(L-value인지 R-value인지)을 유지합니다.
    processValue(std::forward<T>(value));
}

int main() {
    int x = 42;

    // 1. L-value 전달 - processValue(int&) 함수 호출
    forwardValue(x);

    // 2. R-value 전달 - processValue(int&&) 함수 호출
    forwardValue(100);

    return 0;
}

위의 예시에서 std::forward를 사용하면, 전달된 인자의 원래 타입이 유지되므로, 인자가 L-value일 때에는 L-value 참조를, R-value일 때에는 R-value 참조를 유지하면서 각각의 함수가 호출됩니다. 이렇게 하면 오른값으로 전달된 R-value에 대해서는 불필요한 복사를 피하면서 최적화된 동작이 가능해집니다.

저작자표시 (새창열림)

'개발 > C++' 카테고리의 다른 글

람다 표현식 (lambda expression)  (0) 2022.08.19
EBO (Empty Base Optimization)  (0) 2022.07.17
Copy Elision, RVO  (0) 2022.07.07
std::function 이란?  (0) 2022.04.11
JsonCpp 사용법  (2) 2022.02.04
    '개발/C++' 카테고리의 다른 글
    • 람다 표현식 (lambda expression)
    • EBO (Empty Base Optimization)
    • Copy Elision, RVO
    • std::function 이란?
    박오이님
    박오이님
    긍정도 아니고 부정도 아닌 0

    티스토리툴바