|
183 | 183 | //! access to that data to ensure no *moves* or other invalidation occurs, and finally |
184 | 184 | //! provide a safe interface on top. |
185 | 185 | //! |
186 | | -//! There are a couple of linked disadvantages to using this model. The core issue is a lack |
187 | | -//! of generality. This is an issue because it means that each individual type that implements |
188 | | -//! such an interface does so on its own. Each developer implementing such a type must themselves |
189 | | -//! think through all the guarantees needed to ensure the API they present is sound. We would |
190 | | -//! rather build a shared understanding of the problem space and encode that understanding into a |
191 | | -//! shared interface to solve it which everyone helps validate. |
192 | | -//! |
193 | | -//! In addition, in this model, each individual object must assume it is *on its own* to ensure |
| 186 | +//! There are a couple of linked disadvantages to using this model. The most significant is that |
| 187 | +//! each individual object must assume it is *on its own* to ensure |
194 | 188 | //! that its data does not become *moved* or otherwise invalidated. Since there is no shared |
195 | 189 | //! contract between values of different types, an object cannot assume that others interacting |
196 | 190 | //! with it will properly respect the invariants around interacting with its data and must |
197 | 191 | //! therefore protect it from everyone. Because of this, *composition* of address-sensitive types |
198 | 192 | //! requires at least a level of pointer indirection each time a new object is added to the mix |
199 | 193 | //! (and, practically, a heap allocation). |
200 | 194 | //! |
201 | | -//! This is the key thing that drove Rust towards a different model. It is particularly a problem |
| 195 | +//! Although there were other reason as well, this issue of expensive composition is the key thing |
| 196 | +//! that drove Rust towards adopting a different model. It is particularly a problem |
202 | 197 | //! when one considers, for exapmle, the implications of composing together the [`Future`]s which |
203 | 198 | //! will eventaully make up an asynchronous task (including address-sensitive `async fn` state |
204 | 199 | //! machines). It is plausible that there could be many layers of [`Future`]s composed together, |
|
0 commit comments