디시인사이드 갤러리

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

갤러리 본문 영역

gpt글 기깔나게 글 잘 적네

프갤러(221.144) 2025.01.18 21:07:08
조회 136 추천 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/08/11 - -
AD 가전디지털, 휴대폰 액세서리 SALE 운영자 25/08/08 - -
공지 프로그래밍 갤러리 이용 안내 [92] 운영자 20.09.28 46329 65
2881682 챗티씨 왜케 느려터졌냐 [1] 헬마스터갤로그로 이동합니다. 11:34 5 0
2881681 시대전환의 이음새에 절묘하게 끼어 고통만 받았네요. 프갤러(220.84) 11:19 9 0
2881680 님들아 이 2개 어떻게 하는거임? ㅇㅇ갤로그로 이동합니다. 11:18 6 0
2881678 러스트도 모르면서 러스트 찬양하는 사람들 아직 많?? 나르시갤로그로 이동합니다. 11:09 10 0
2881677 편쿨섹좌 현충원 방문 ♥냥덩이♥갤로그로 이동합니다. 10:56 8 0
2881676 냥덩이를 키워야하는 이유❤+ ♥냥덩이♥갤로그로 이동합니다. 10:52 8 0
2881675 술좀 조절해야겠어요;; 일상생활이 피곤하고 힘드네요... ㅇㅇ(223.39) 10:30 11 0
2881674 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥냥덩이♥갤로그로 이동합니다. 09:53 12 0
2881673 나님 시간날때 이재명 심리분석글 하나 써줌 ♥냥덩이♥갤로그로 이동합니다. 09:49 13 0
2881672 나님 앙⭐+ 했어양❤+ ♥냥덩이♥갤로그로 이동합니다. 09:46 15 0
2881671 더불어민주당 불법정치자금 특검,전수조사 필요 ♥냥덩이♥갤로그로 이동합니다. 09:40 20 0
2881670 더불어민주당 이춘석 차명거래 부정비리의혹 전격 소환 조사 ♥냥덩이♥갤로그로 이동합니다. 08:55 19 0
2881669 평소 정치성향 아예 안 드러내는 사람들도 이재명 손절침 ㄷㅅㄷ ♥냥덩이♥갤로그로 이동합니다. 08:53 22 0
2881668 2찢명 범죄자 사면남용 사태 ㄹㅇ 여파 존나 심상치 않네 ♥냥덩이♥갤로그로 이동합니다. 08:52 22 0
2881658 여자애 잠지가 최고야 류류(118.235) 06:37 38 1
2881629 지금 이상태가 최상. 넥도리아(220.74) 05:40 34 0
2881594 역시 랩 메모리 보조기억장치? 주기억장치는 아닐듯 넥도리아(220.74) 03:54 32 0
2881589 와 이거 Bolt.diy 이거 상당히 잘만들었네 ㅆㅇㅆ(124.216) 03:47 33 0
2881584 고장나서 샀어. 근데 단선된걸러 연결하고 있었어 혹시 넥도리아(220.74) 03:25 20 0
2881580 님들 근데 서버 전용 데스크탑이 일반적으로 워크스테이션이라고하잔슴 [4] 우흥갤로그로 이동합니다. 02:48 38 0
2881579 화면 부팅안 되고 새 랜선 설치해서 물어볼건데 911테러 의심 넥도리아(220.74) 02:39 24 0
2881578 내란지원금으로 내 젠폰4 살리고 싶다. 넥도리아(220.74) 02:35 34 0
2881575 러스트는 지능의 문제가 아니라 설계 철학의 문제이다. 나르시갤로그로 이동합니다. 02:29 50 0
2881574 나님 깻당? ♥냥덩이♥갤로그로 이동합니다. 02:25 29 0
2881572 술 진탕 마셨는데 루도그담당(118.235) 01:58 29 0
2881571 음기 충전 발명도둑잡기갤로그로 이동합니다. 01:48 37 0
2881548 인터넷 거실 서 측정하는데 느린가요? [2] 넥도리아(220.74) 00:51 30 0
2881547 인터넷 거실 서 측정하는데 느린가요? [2] 넥도리아(220.74) 00:51 38 0
2881546 색계보는데 [7] 아스카영원히사랑해갤로그로 이동합니다. 00:36 71 0
2881544 실시간베스트 내 귀에 도청장치 사건 글 보니 생각나는 아까 쓴 글 발명도둑잡기갤로그로 이동합니다. 00:29 25 0
2881543 어떤 나라 사람들은 찻지피티라고 하네 발명도둑잡기갤로그로 이동합니다. 00:22 17 0
2881542 [플라이 미 투 더 문] 메인 예고편 발명도둑잡기갤로그로 이동합니다. 00:17 20 0
2881540 달착륙설 믿는 애들은 이건 어떻게 설명함? [5] 야옹아저씨갤로그로 이동합니다. 08.14 102 5
2881539 신입, 주니어 취업 질문 ㅇㅇ(180.69) 08.14 44 0
2881537 대기업들 미국으로 전부 이전하든 니들이 앰생인건 똑같잖아 ㅋㅋㅋ [1] 뒷통수한방(1.213) 08.14 33 0
2881530 내일부터 찬물샤워 미라클모닝 할거야 재현갤로그로 이동합니다. 08.14 19 0
2881528 나님 쉬야완⭐+ ♥냥덩이♥갤로그로 이동합니다. 08.14 39 0
2881523 크롬창 뒤로 보내니까 유튜브 렉걸리는데 ㅇㅇ(106.241) 08.14 23 0
2881521 수학 넘 잼씀 [1] ♥냥덩이♥갤로그로 이동합니다. 08.14 58 0
2881520 우연치 않게 엄청난 걸 발견해 버렸다... 프갤러(221.154) 08.14 40 0
2881517 8.14 국회 국제 심포지엄 생중계 / 전후 80년, 세계 그리고 한국 발명도둑잡기갤로그로 이동합니다. 08.14 16 0
2881513 모기 있는거 같당.. ♥냥덩이♥갤로그로 이동합니다. 08.14 39 0
2881507 퐁퐁남 석열이 도축 엔딩 뜨노 ㅠㅠ [1] 아스카영원히사랑해갤로그로 이동합니다. 08.14 58 0
2881503 이때 모모링은 귀여웠는데 ㅠ ♥냥덩이♥갤로그로 이동합니다. 08.14 53 0
2881502 도쿄 외곽 4인가족 집이 아스카영원히사랑해갤로그로 이동합니다. 08.14 32 0
2881500 나님 주무실게양⭐+ ♥냥덩이♥갤로그로 이동합니다. 08.14 43 0
2881499 데뷔 1년차 신입 걸그룹 스케줄 [1] 발명도둑잡기갤로그로 이동합니다. 08.14 31 0
2881498 결단력없이 떠내려온 결과가 지금입니다. 프갤러(220.84) 08.14 32 0
2881496 오 씨발 살려다오 [1] 골방외톨이갤로그로 이동합니다. 08.14 36 0
뉴스 “작은 엉덩이가 이상형”…최홍만, 여친 이야기하며 ‘눈물’ 디시트렌드 08.13
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2