디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

gpt글 기깔나게 글 잘 적네

프갤러(221.144) 2025.01.18 21:07:08
조회 129 추천 0 댓글 3

1. Lvalue란?

Lvalue는 "메모리의 특정 주소를 가진 값"을 의미합니다.

  • 특징:
    • 이름이 있는 값.
    • 메모리 위치에 저장되며, 변경 가능(mutable).
    • &(주소 연산자)로 해당 값을 참조할 수 있음.
int a = 10;    // a는 lvalue
a = 20;        // lvalue에 값 할당
int* p = &a;   // lvalue의 주소를 참조 가능

2. Rvalue란?

Rvalue는 "임시로 생성된 값" 또는 "메모리 주소가 없는 값"을 의미합니다.

  • 특징:
    • 보통 임시 값(temporary value)로 표현.
    • 메모리에 저장되지 않으므로 이름이 없음.
    • 변경 불가능(immutable).
int b = 10 + 20;   // 10 + 20은 rvalue
int c = b * 2;     // b * 2는 rvalue

 

3. Lvalue와 Rvalue의 구분

Lvalue

  • 특정 메모리 주소를 참조.
  • 수정 가능.
  • 이름을 가짐.

Rvalue

  • 임시적으로 생성된 값.
  • 수정 불가능.
  • 메모리 주소를 가지지 않음.
int x = 10;      // x는 lvalue, 10은 rvalue
x = 20;          // x는 lvalue, 20은 rvalue
int* p = &x;     // x는 lvalue, 주소를 가질 수 있음
// int* q = &(x + 1); // ERROR: (x + 1)은 rvalue, 주소를 가질 수 없음

 

특징 Lvalue Rvalue
정의 메모리 주소를 가지는 값 임시적으로 생성된 값
변경 가능 여부 변경 가능 변경 불가능
참조 타입 T& T&&
주소 연산자 사용 가능 불가능
예시 변수(int a) 리터럴(10), 표현식(x + y)

 

 

이동 시맨틱(Move Semantics)

이동 시맨틱은 C++에서 객체의 소유권을 이전하고, 불필요한 복사를 줄여 성능을 최적화하는 중요한 기능입니다. 이 개념은 **rvalue 참조(T&&)**와 함께 C++11에서 도입되었습니다

 

복사와 이동의 차이

복사(Copy)

  • 데이터를 복제합니다.
  • 원본과 복사본이 독립적인 자원을 가집니다.
  • 비용이 비쌉니다(예: 동적 메모리의 복사).

이동(Move)

  • 데이터를 복제하지 않고 소유권을 이전합니다.
  • 원본 객체의 자원을 대상 객체로 이전한 후, 원본은 비워지거나 초기화됩니다.
  • 비용이 저렴합니다(포인터 이동만 수행).
#include <iostream>
#include <utility>
#include <string>

int main() {
    std::string str = "hello";
    std::string movedStr = std::move(str); // str을 rvalue로 변환 후 이동

    std::cout << "Moved string: " << movedStr << '\n'; // "hello"
    std::cout << "Original string: " << str << '\n';   // (비어 있음)

    return 0;
}

 

출력결과

Moved string: hello
Original string:

 

std::move

template <typename T>
constexpr typename std::remove_reference<T>::type&& simple_move(T&& t) noexcept {
    return static_cast<typename std::remove_reference<T>::type&&>(t);
}

 

 

remove_reference<T>::type&& 

객체의 참조를 제거하여 기본타입을 추출

T&&->T

T&->T

static_cast<typename remove_reference<T>::type&&>(t)

객체를 rvalue 참조(T&&)로 변환합니다.

lvalue ->rvalue

rvalue->rvalue

변환

 

보편적 참조(Universal Reference)

보편적 참조는 C++11에서 템플릿 타입 유추와 함께 등장한 개념으로, lvalue 참조rvalue 참조를 모두 받아들일 수 있는 참조를 의미합니다.

보편적 참조는 "타입 추론의 맥락에서만" 동작하며, 이를 통해 완벽한 전달(perfect forwarding)을 구현할 수 있습니다.

 

 

#include <utility>
#include <iostream>

struct Data {
    Data& operator=(const Data& other) {
        std::cout << "Copy assignment" << std::endl;
        return *this;
    }

    Data& operator=(Data&& other) {
        std::cout << "Move assignment" << std::endl;
        return *this;
    }
};

class Container {
public:
    template <typename T>
    void Put(T&& data) {
        data_ = std::forward<T>(data);
    }

private:
    Data data_{};
};

int main() {
    Container container{};
    Data data{};
    container.Put(data);
    container.Put(Data{});
}

 

출력결과

Copy assignment
Move assignment

 

 

std::forward의 정의

template <typename T>
T&& forward(typename std::remove_reference<T>::type& value) noexcept {
    return static_cast<T&&>(value);
}

 

만약 T가 Type&이면 → T&&는 Type&.

만약 T가 Type이면 → T&&는 Type&&.

lvalue/rvalue 특성을 유지하며 반환

 

 

입력 타입 결과 타입
T& & T&
T& && T&
T&& & T&
T&& && T&&

 

  • int& && → int&: rvalue reference와 lvalue reference가 중첩되면, lvalue reference가 우선됩니다.
  • int&& && → int&&: rvalue reference끼리 중첩되면, 그대로 유지됩니다.

 

 

#include <iostream>
#include <type_traits>
#include <utility>

template <class T>
T& forward(std::remove_reference_t<T>& t) {
    return static_cast<T&>(t);
}

template <class T>
T&& forward(std::remove_reference_t<T>&& t) {
    return static_cast<T&&>(t);
}

void Print(int&) {
    std::cout << "lvalue" << std::endl;
}

void Print(int&&) {
    std::cout << "rvalue" << std::endl;
}

template <class SomeType>
void DoSmth(SomeType&& value) {
    Print(forward<SomeType>(value));
}

int main() {
    int number;
    DoSmth(number);           // DoSmth(int&)
    DoSmth(42);               // DoSmth(int&&)
    DoSmth(std::move(number)); // DoSmth(int&&)
}​

 

출력

lvalue
lvalue
lvalue

 

template <class T>
T& forward(std::remove_reference_t<T>& t) {
    return static_cast<T&>(t);
}

template <class T>
T&& forward(std::remove_reference_t<T>&& t) {
    return static_cast<T&&>(t);
}

Print(forward<SomeType>(value));

forward (value) lvalue라 항상 처음 lvalue forward만 실행된다

#include <iostream>
#include <type_traits>
#include <utility>

template <class T>
T&& forward(std::remove_reference_t<T>& t) noexcept {
    return static_cast<T&&>(t);
}

void Print(int&) {
    std::cout << "lvalue" << std::endl;
}

void Print(int&&) {
    std::cout << "rvalue" << std::endl;
}

template <class SomeType>
void DoSmth(SomeType&& value) {
    Print(forward<SomeType>(value));
}

int main() {
    int number;
    DoSmth(number);           // lvalue 전달
    DoSmth(42);               // rvalue 전달
    DoSmth(std::move(number)); // rvalue 전달
}

 

출력

lvalue
rvalue
rvalue

 

lvalue rvalue 값을 보존한체 출력한다

매게변수를 lvalue로 설정하는 이유

(std::remove_reference_t<T>& t) 즉

C++에서 rvalue reference(&&)도 함수의 매개변수로 전달되면 lvalue로 취급되기 때문입니다.

리턴 타입을 통해 원래 특성(lvalue/rvalue)을 유지

T&&와 참조 붕괴 규칙

  • 반환 타입을 T&&로 설정하고, 내부적으로 static_cast<T&&>(value)를 사용하면 원래 특성을 복원할 수 있습니다.
  • 참조 붕괴 규칙에 따라:
    • T = Type → T&& = Type&& → rvalue.
    • T = Type& → T&& = Type& → lvalue.
template <class T>
T&& forward(std::remove_reference_t<T>& t) noexcept {
    return static_cast<T&&>(t);
}

 

추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 끝까지 다 본 걸 후회하게 만든 용두사미 드라마는? 운영자 25/07/07 - -
AD 휴대폰 바꿀까? 특가 구매 찬스! 운영자 25/07/02 - -
2870063 리액트 문서 다 읽어봤는데 왜 당시 혁명이었는지 알겠네 [11] ㅆㅇㅆ(124.216) 07.06 108 1
2870062 정보) 국가별 게임 목록.jpg [6] ㅇㅇ(218.144) 07.06 200 17
2870060 학회지 제 36회 논문 판다. 거래는 알뜰나눔장터 도리스아(112.170) 07.06 38 0
2870059 위대한 오픈소스와 나르시시즘: 목차 제안 [2] 루비갤로그로 이동합니다. 07.06 53 0
2870056 오늘의 발명 실마리: 디씨에 AI로 힙합 기수 칭찬, 욕하는 자동글 발명도둑잡기(118.216) 07.06 73 0
2870054 AI가 일으킨 첫 번째 전쟁 발명도둑잡기(118.216) 07.06 34 0
2870052 러스트 FFI의 모순 루비갤로그로 이동합니다. 07.06 26 0
2870050 일본 손글씨 기계 발명도둑잡기(118.216) 07.06 35 0
2870048 러빠 이제 러스트 손절치냐 ㅋㅋ 루비갤로그로 이동합니다. 07.06 61 0
2870046 애드센스 또 거부 당했네 ㅠㅠ 루비갤로그로 이동합니다. 07.06 30 0
2870045 빌보드 핫100 노래 모두 이 노래보다는 사실 얌전한 내용이다 발명도둑잡기(118.216) 07.06 37 0
2870044 Jpa는 쓰면쓸수록 병신같노 [1] 프갤러(118.235) 07.06 41 0
2870042 요즘 아이들의 '친일 혐중', 오늘도 원인을 찾는 중입니다 발명도둑잡기(118.216) 07.06 25 0
2870039 강남 같은 동네 주민들의 닭싸움 케이지 발명도둑잡기(118.216) 07.06 30 0
2870037 우디 거스리 발명도둑잡기(118.216) 07.06 15 0
2870035 RPA취업 프갤러(1.243) 07.06 26 0
2870034 공부하기 좋은 세상이다 [1] 초코냥갤로그로 이동합니다. 07.06 65 0
2870033 오늘한일 [2] PyTorch갤로그로 이동합니다. 07.06 57 1
2870032 이 땅은 너희의 땅 발명도둑잡기(118.216) 07.06 31 0
2870031 똥양인들은 머리에 번식,동족포식 생각밖에없음?? 뒷통수한방(1.213) 07.06 23 0
2870030 썡노가다 하다보니 IAT 찾았다 루도그담당(58.239) 07.06 36 0
2870028 What The Fuck Is A Kilometer 발명도둑잡기(118.216) 07.06 22 0
2870027 [로터리] 토지공개념은 '소설'이 아니다. 발명도둑잡기(118.216) 07.06 18 0
2870026 재활용 할가요 도리스아(112.170) 07.06 24 0
2870025 오늘의 소설, 영화 실마리: 거대 닭이 인간에게 복수 [2] 발명도둑잡기(118.216) 07.06 25 0
2870024 요즘 자라나는 새싹들 마인드 ) 크게 통수한방치고 해외로 튀기 뒷통수한방(1.213) 07.06 23 0
2870022 NFT는 저작권 보호 도구인가 저작권 침해 도구인가 발명도둑잡기(118.216) 07.06 30 0
2870021 트위터 창업자 “모든 지재권 법 없애자” 주장 논란…머스크도 맞장구 발명도둑잡기(118.216) 07.06 21 0
2870020 "GPU는 사면서, 데이터는 왜 훔쳐" 빅테크의 질주, 뒤에서 발명도둑잡기(118.216) 07.06 30 0
2870019 어셈블리어 발명도둑잡기(118.216) 07.06 31 0
2870017 내일까지 이거 끝내고 블로그 글 적고 ㅆㅇㅆ(124.216) 07.06 29 1
2870015 이 기사 보는 즉시 비번 바꿔라…구글·애플 160억개 개인정보 유출 발명도둑잡기(118.216) 07.06 25 0
2870014 뭐냐 졸다가 점점 세진다. 강도가... 넥도리아(112.170) 07.06 24 0
2870013 C井と書いて [2] 슈퍼막코더(110.133) 07.06 43 0
2870012 고향가면 구축 2억이면 사는데 ㅇㅇ(118.235) 07.06 29 0
2870011 진앙지가 우리집일까 집 군포로 뜨는데 안양시 동안구인데, 넥도리아(112.170) 07.06 23 0
2870009 정크푸드 케이라면 발명도둑잡기(118.216) 07.05 33 0
2870008 뭐지? 지진? 우리집인가? 40년된 주택 넥도리아(112.170) 07.05 25 0
2870006 고춧가루 ㅇㅇ(117.111) 07.05 25 0
2870004 스마트팜 아두이노로는 턱도 없어서 PLC 해야함 [3] ㅆㅇㅆ(124.216) 07.05 69 0
2870003 나 귀농하려고 스마트팜 아두이노 만들고 있음 [2] 프갤러(14.5) 07.05 62 0
2870002 내얼굴 ㅁㅌㅊ냐 [1] ㅇㅇ(222.108) 07.05 75 0
2870001 다음달에 DPP 먼지 보고싶어요 [4] PyTorch갤로그로 이동합니다. 07.05 60 0
2870000 GPT로 궁합분석하는 웹사이트를 만들었는데 같이 돈벌어볼 사람있나..? 프갤러(218.152) 07.05 34 0
2869999 윤건영, ‘외환죄’ 정조준.. “‘기밀’ 운운하는 자 내란공범” [1] 발명도둑잡기(118.216) 07.05 66 0
2869998 유니티 라이프 사이클은 템플릿 매서드랑 관련해서 설명했음 [1] ㅆㅇㅆ(124.216) 07.05 56 0
2869997 뉴스1의 ‘삼부토건, 유튜브 운영자 고소’ 보도 이상한 이유 [1] 발명도둑잡기(118.216) 07.05 33 0
2869996 나님 목소리 최초 공개❤+ [4/1] ♥냥덩이♥갤로그로 이동합니다. 07.05 75 0
2869995 시간당 13000원에 주 2회 학생 2명 하루 2시간 가르치거든 [3] ㅆㅇㅆ(124.216) 07.05 53 0
2869994 학생한테 zenject를 쓰라고 해야하긴하는데 내 자신이 zenject [2] ㅆㅇㅆ(124.216) 07.05 45 0
뉴스 정동원, ‘걍남자’서 임영웅과 1박 2일 캠핑 여행 "찐형제 케미" 디시트렌드 07.04
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2