디시인사이드 갤러리

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

갤러리 본문 영역

gpt글 기깔나게 글 잘 적네

프갤러(221.144) 2025.01.18 21:07:08
조회 61 추천 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/01/13 - -
2806297 나의 이상형 공개 [7] *루비*갤로그로 이동합니다. 01:14 72 1
2806292 아오 디시 난리가 났네 ㅇㅇ갤로그로 이동합니다. 01:09 44 0
2806273 돈이야 어차피 없어도 잘 살 수 있음. 마누라 있으면 좋겠지만 [9] ㅆㅇㅆ(124.216) 00:30 97 0
2806269 좌파들은 절대 끝까지 못 보는 영상 ㅋㅅㅋ ♥냥덩이♥갤로그로 이동합니다. 00:26 31 0
2806268 좌청래 참교육 ♥냥덩이♥갤로그로 이동합니다. 00:24 34 0
2806264 ㅆㅇㅆ야 개발 기술로 돈번다는 생각을 좀 버려라 [3] ㅇㅇ(112.161) 00:21 70 0
2806262 틀 노이만 구조 때려치우고 프갤러(106.241) 00:19 63 0
2806258 영어발움 ㅍㅌㅊ? ㅇㅇ(110.45) 00:14 48 0
2806253 ㅆㅇㅆ 안타깝네 [1] ㅇㅇ(112.161) 00:08 68 0
2806252 김정은한테 따져라 ! 진짜 군인의 작심 발언 ♥냥덩이♥갤로그로 이동합니다. 00:05 26 0
2806248 요즘에 알리 링크로 돈 버는 개발자들이 많은거 같음 프갤러(14.39) 00:01 41 0
2806247 윤수괴가 계엄성공했으면 전국민이 윤비어천가 [1] 헬마스터갤로그로 이동합니다. 01.18 63 2
2806243 윤수괴표 샌드위치가 먹고싶구나 헬마스터갤로그로 이동합니다. 01.18 22 0
2806240 뼈속까지 민주당인 전라도 20대 여자가 윤석열을 지지하게 된 이유 [1] ♥냥덩이♥갤로그로 이동합니다. 01.18 59 0
2806237 북괴처 차량에 핑핑이 입갤 ㅋㅋㅋㅋㅋㅋㅋ ♥냥덩이♥갤로그로 이동합니다. 01.18 21 0
2806234 미국 공식 입장 뜸 ㅇㅅㅇ ♥냥덩이♥갤로그로 이동합니다. 01.18 43 0
2806231 C언어를 배우라는 건 그 언어 자체를 배우라는게 아님 [20] ㅆㅇㅆ(124.216) 01.18 301 5
2806223 c언어 배워야하는 이유가 뭐임 [3] 프갤러(1.245) 01.18 82 0
2806221 이번주 IT 소식도 다 읽었으니 1시까지 작업하다 자야긋다 [1] ㅆㅇㅆ(124.216) 01.18 40 0
2806220 사이버덱 경진대회 발명도둑잡기갤로그로 이동합니다. 01.18 19 0
2806217 나님 옷 다 벗엇어양❤+ ♥냥덩이♥갤로그로 이동합니다. 01.18 36 0
2806214 이번주 재밌게 본 해외 기사들 [4] ㅆㅇㅆ(124.216) 01.18 209 7
2806213 2030 착취해서 일 안하고 잘 살고 싶다는게 4050 빨갱이세대임 ♥냥덩이♥갤로그로 이동합니다. 01.18 29 0
2806211 종북내란 MBC 조작날조방송 ♥냥덩이♥갤로그로 이동합니다. 01.18 21 0
2806210 ❤✨☀⭐나님 시작합니당⭐☀✨❤ ♥냥덩이♥갤로그로 이동합니다. 01.18 22 0
2806209 춥고 배고파 [2] 주아갤로그로 이동합니다. 01.18 33 0
2806207 난 중소라도 가고싶다 [2] ㅇㅇ(175.120) 01.18 78 0
2806205 10시까지 코딩하다가 이번주 기술동향 보는데 이번주 많은 일이 있었구만 ㅆㅇㅆ(124.216) 01.18 40 0
2806204 연애섹스하기 귀찮아서 걍 썸만탐 [3] ㅇㅇ(211.234) 01.18 102 0
2806203 나 취직할 수 있냐 [5] 프갤러(219.251) 01.18 109 0
2806201 SO안에 SO 직렬화하는거 모듈화 이점있다 생각했는데 유니티에서 ㅆㅇㅆ(124.216) 01.18 31 0
2806200 파이썬 고언어는 하기 싫어. [1] 프갤러(59.16) 01.18 37 0
2806199 [소식] 자유 대한민국 사이트 공식 입장 + 암행어사 디지털 마패 앱 프갤러(121.172) 01.18 40 0
2806197 플러터 포함해서 기술동향이라는게 쉽게 예측은 불가능한게 ㅆㅇㅆ(124.216) 01.18 42 0
2806194 유니티 SO안에 SO 데이터를 직렬화하는건 에디터를 수정해야하는건데 [7] ㅆㅇㅆ(124.216) 01.18 49 0
2806193 섹스 !! ♥냥덩이♥갤로그로 이동합니다. 01.18 36 0
2806192 플러터 전망 [5] 프갤러(1.224) 01.18 71 1
2806190 tailwindcss 장점 [3] CreeJee(유동근)갤로그로 이동합니다. 01.18 54 0
2806188 나님 끙야하니까 몸이 빠진다냐앙.. ♥냥덩이♥갤로그로 이동합니다. 01.18 27 0
2806187 명문대 연달아 자유민주주의수호 탄핵반대 시국선언 [5] ♥냥덩이♥갤로그로 이동합니다. 01.18 110 0
2806186 자유민주주의 수호 탄핵반대 시민들 규모 ㄷㅅㄷ ♥냥덩이♥갤로그로 이동합니다. 01.18 50 1
2806184 요즘 생각이 너무 많아서 잠이 안옴... 그래서 나가서 뛰려고... ㅇㅇ(223.38) 01.18 32 0
2806183 종북내란 좌BC 벌써 대놓고 공산화 들어가는즁 [2] ♥냥덩이♥갤로그로 이동합니다. 01.18 60 0
2806182 내가 지피티 보다 요약 더 잘함 이동시맨틱 ㅈㄴ 쉽게 비유하잖아 [2] ㅆㅇㅆ(124.216) 01.18 40 0
2806180 나님 야간끙야즁❤+ ♥냥덩이♥갤로그로 이동합니다. 01.18 40 0
gpt글 기깔나게 글 잘 적네 [3] 프갤러(221.144) 01.18 61 0
2806177 만취다 [15] 멍청한유라ㅋ갤로그로 이동합니다. 01.18 83 0
2806176 3040 오늘 뭐했노 ㅇㅇ [1] 포항의봄갤로그로 이동합니다. 01.18 51 0
2806173 it 직종은 학력,전공 안보고 평등하게 뽑아서 좋네 [1] ㅇㅇ(221.164) 01.18 73 0
2806169 점심 간식 저녁 간식 [3] 발명도둑잡기갤로그로 이동합니다. 01.18 56 1
뉴스 '더 딴따라' 오늘 마지막 회, 최후의 1인 결정...박진영, TOP8과 합동 무대 예고 디시트렌드 18:00
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2