본문 바로가기

C

c++ lvalue rvalue zero copy

공부 기록을 남긴다.

lvalue rvalue zero copy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include <iostream>
#include <array>
#include <vector>
#include <string>
 
class Cat
{
public:
    void setName(std::string name)
    {
        mName = std::move(name);
    };
private:
    std::string mName;
};
 
void storeByValue(std::string s)
{
    std::string b = s;
}
 
void storeByLRef(std::string& s)
{
    std::string b = s;
}
 
void storeByRRef(std::string&& s)
{
    //std::string b = s; // wrong!
    std::string b = std::move(s);
 
}
 
void storeByRRef_const(const std::string&& s)
{
    // input을 const로 받으면 copy가 일어나게 된다
    // visual studio 2019에서는 에러 발생
    std::string b = std::move(s);
    
}
 
void fooV(int a)
{
    int b = a + 1;
}
 
void fooP(int* ap)
{
    int b = *ap + 1;
    *ap = 100;
}
 
void fooR(const int &a)
{
    int b = a + 1;
    //a = 100; // 에러(const a 이므로)
}
 
int main()
{
    int a = 0;
    // a가 두번 생성됨
    fooV(a);
    // 사실 포인터와 레퍼런스로 넣어 주는 것은 똑같다.
    // 표기의 차이임
    fooP(&a);
    fooR(a);
    // 포인터를 꼭 써야 하는 경우가 아니면
    // 레퍼런스를 사용하도록 한다
 
    std::vector<int> vec;
    int a1 = 1;
    int a2 = 2;
 
    vec.push_back(a1);
    vec.push_back(a2);
 
    std::string string_a = "abc";
    storeByValue(string_a); // (two copy)abc 총 3번 생김(string_a, storeByValue에서 string_a,
                            // string b = "abc" 에서 , 다 합치면 3번임
    storeByLRef(string_a); // (one copy)abc 총 2번 생김 string_a abc 1번, b에서 abc 1번 총 두번
    storeByRRef(std::move(string_a));
    storeByRRef("abc"); // (zero copy)copy 한번도 안 일어남
    //storeByRRef_const(string_a); // gcc에서는 compile 가능
 
 
    std::string testa = "devwoong";
    std::cout << "a: " << testa << std::endl;
 
    std::string testb = std::move(testa);
    std::cout << "b: " << testb << std::endl;
    std::cout << "a: " << testa << std::endl// std::move로 없어 짐
    // std::move로 resource ownership을 다른 부분으로 옮겨 줌
 
 
    Cat kitty;
    std::string s = "kitty";
 
    kitty.setName(s); // Copy 1번
    kitty.setName("nabi"); // rvalue 전달 zero copy 발생!
    return 0;
}

 

'C' 카테고리의 다른 글

c++ object memory alignment  (0) 2021.06.23
c++ copy elison, Retrun value optimization  (0) 2021.06.23
c++ heap memory space  (0) 2021.06.22
c++ stack 공간, class, struct, 타입별 메모리 사이즈  (0) 2021.06.22
c++ extern static 기록 정리  (0) 2021.06.22