본문 바로가기

C

c++ optional (C++17부터 지원)

optional의 메모리 구조는

int num = 10;

std::optional<int> num1 = 20; 이라면

 

stack에 num = 20 말고도, valid or invalid가 따로 저장된다.

따라서 기본 int 보다 약간 사이즈가 더 크다.

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
#include <iostream>
#include <optional>
 
 
std::optional<int> divide(int a, int b)
{
    if (b == 0)
    {
        return std::nullopt;
    }
    return a / b;
}
 
class Cat
{
private:
    int n = 10;
public:
    void print() const
    {
        std::cout << "meow" << n << std::endl;
    }
};
 
int main()
{
    // optional은 변수가 있을수도 있고 없을수도 있을때 정의
    const auto answer = divide(101);
    if (answer)
    {
        std::cout << answer.value() << std::endl;
    }
    else
    {
        std::cout << "no value" << std::endl;
    }
 
    const auto answer1 = divide(100);
    if (answer1)
    {
        std::cout << answer1.value() << std::endl;
    }
    else
    {
        std::cout << "no value" << std::endl;
        
        std::cout << answer1.value_or(0<< std::endl;
    }
 
    std::optional<Cat> cat;
    if (!cat)
    {
        std::cout << "no cat yet" << std::endl;
    }
 
    // tmp Cat -> move(비효율적이다)
    // Cat()을 명시해줘야 한다.
    // std::in_place 해야 한다.
    //std::optional<Cat> cat{ Cat() };
    std::optional<Cat> cat1{ std::in_place };
    if (!cat1)
    {
        std::cout << "no cat yet" << std::endl;
    }
    else
    {
        std::cout << "cat is ready" << std::endl;
        cat1->print();
    }
 
 
    // optional 변수에는 num2에 20 말고, valid, invalid
    // 같은 값이 추가로 더 붙는다. 성능에 약간 영향 미침
    int num = 10;
    std::optional<int> num2{ 20 };
    std::cout << sizeof(num) << std::endl// 4
    std::cout << sizeof(num2) << std::endl// 8
    return 0;
}

 

'C' 카테고리의 다른 글

c++ Union, Variant  (0) 2021.06.28
C++ enum class(매우 중요)  (0) 2021.06.28
c++ tuple, pair  (0) 2021.06.28
c++ float 조심할 점  (0) 2021.06.28
c++ stl heap 기록  (0) 2021.06.28