Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7)

Side by Side Diff: docs/optional.md

Issue 2080003002: base::Optional: Use anonymous union instead of base::AlignedMemory (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 # base::Optional 1 # base::Optional
2 2
3 `base::Optional<T>` is a container that might contain an instance of `T`. 3 `base::Optional<T>` is a container that might contain an instance of `T`.
4 4
5 [TOC] 5 [TOC]
6 6
7 ## History 7 ## History
8 8
9 [base::Optional<T>](https://code.google.com/p/chromium/codesearch#chromium/src/b ase/optional.h) 9 [base::Optional<T>](https://code.google.com/p/chromium/codesearch#chromium/src/b ase/optional.h)
10 is an implementation of [std::optional<T>](http://en.cppreference.com/w/cpp/util ity/optional), 10 is an implementation of [std::optional<T>](http://en.cppreference.com/w/cpp/util ity/optional),
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
69 base::Optional<int> opt = make_optional<int>(GetMagicNumber()); 69 base::Optional<int> opt = make_optional<int>(GetMagicNumber());
70 ``` 70 ```
71 71
72 Finally, `base::Optional<T>` is integrated with `std::hash`, using 72 Finally, `base::Optional<T>` is integrated with `std::hash`, using
73 `std::hash<T>` if it is not empty, a default value otherwise. `.emplace()` and 73 `std::hash<T>` if it is not empty, a default value otherwise. `.emplace()` and
74 `.swap()` can be used as members functions and `std::swap()` will work with two 74 `.swap()` can be used as members functions and `std::swap()` will work with two
75 `base::Optional<T>` objects. 75 `base::Optional<T>` objects.
76 76
77 ## How is it implemented? 77 ## How is it implemented?
78 78
79 `base::Optional<T>` is implemented using `base::AlignedMemory`. The object 79 `base::Optional<T>` is implemented with a union with a `T` member. The object
80 doesn't behave like a pointer and doesn't do dynamic memory allocation. In 80 doesn't behave like a pointer and doesn't do dynamic memory allocation. In
81 other words, it is guaranteed to have an object allocated when it is not empty. 81 other words, it is guaranteed to have an object allocated when it is not empty.
82 82
83 ## When to use? 83 ## When to use?
84 84
85 A very common use case is for classes and structures that have an object not 85 A very common use case is for classes and structures that have an object not
86 always available, because it is early initialized or because the underlying data 86 always available, because it is early initialized or because the underlying data
87 structure doesn't require it. 87 structure doesn't require it.
88 88
89 It is common to implement such patterns with dynamically allocated pointers, 89 It is common to implement such patterns with dynamically allocated pointers,
90 `nullptr` representing the absence of value. Other approaches involve 90 `nullptr` representing the absence of value. Other approaches involve
91 `std::pair<T, bool>` where bool represents whether the object is actually 91 `std::pair<T, bool>` where bool represents whether the object is actually
92 present. 92 present.
93 93
94 It can also be used for simple types, for example when a structure wants to 94 It can also be used for simple types, for example when a structure wants to
95 represent whether the user or the underlying data structure has some value 95 represent whether the user or the underlying data structure has some value
96 unspecified, a `base::Optional<int>` would be easier to understand than a 96 unspecified, a `base::Optional<int>` would be easier to understand than a
97 special value representing the lack of it. For example, using -1 as the 97 special value representing the lack of it. For example, using -1 as the
98 undefined value when the expected value can't be negative. 98 undefined value when the expected value can't be negative.
99 99
100 ## When not to use? 100 ## When not to use?
101 101
102 It is recommended to not use `base::Optional<T>` as a function parameter as it 102 It is recommended to not use `base::Optional<T>` as a function parameter as it
103 will force the callers to use `base::Optional<T>`. Instead, it is recommended to 103 will force the callers to use `base::Optional<T>`. Instead, it is recommended to
104 keep using `T*` for arguments that can be ommited, with `nullptr` representing 104 keep using `T*` for arguments that can be ommited, with `nullptr` representing
105 no value. 105 no value.
106 106
107 Furthermore, depending on `T`, MSVC might fail to compile code using 107 Furthermore, depending on `T`, MSVC might fail to compile code using
108 `base::Optional<T>` as a parameter because of memory alignment issues. 108 `base::Optional<T>` as a parameter because of memory alignment issues.
OLDNEW
« base/optional.h ('K') | « base/optional.h ('k') | styleguide/c++/c++11.html » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698