You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: src/memory-model.md
+27-6
Original file line number
Diff line number
Diff line change
@@ -15,31 +15,52 @@ The most basic unit of memory in Rust is a byte. All values in Rust are computed
15
15
> While bytes in Rust are typically lowered to hardware bytes, they may contain additional values,
16
16
> such as being uninitialized, or storing part of a pointer.
17
17
18
+
r[memory.byte.contents]
19
+
Each byte may have one of the following values:
20
+
18
21
r[memory.byte.init]
19
-
Each byte may be initialized, and contain a value of type `u8`, as well as an optional pointer fragment. When present, the pointer fragment carries [provenance][type.pointer.provenance] information.
22
+
* An initialized byte containing a `u8` value and optional [provenance][type.pointer.provenance],
20
23
21
24
r[memory.byte.uninit]
22
-
Each byte may be uninitialized.
25
+
* An uninitialized byte.
23
26
24
27
> [!NOTE]
25
28
> Uninitialized bytes do not have a value and do not have a pointer fragment.
26
29
30
+
> [!NOTE]
31
+
> The above list is not yet guaranteed to be exhaustive.
32
+
27
33
## Value Encoding
28
34
29
35
r[memory.encoding]
30
36
31
37
r[memory.encoding.intro]
32
-
Each type in Rust has 0 or more values, which can have operations performed on them
38
+
Each type in Rust has 0 or more values, which can have operations performed on them. Values are represented in memory by encoding them
33
39
34
40
> [!NOTE]
35
41
> `0u8`, `1337i16`, and `Foo{bar: "baz"}` are all values
36
42
37
43
r[memory.encoding.op]
38
-
Each value of a type can be encoded into a sequence of bytes, and decoded from a sequence of bytes, which has a length equal to the size of the type.
39
-
The operation to encode or decode a value is determined by the representation of the type.
44
+
Each type defines a pair of properties which, together, define the representation of values of the type. The *encode* operation takes a value of the type and converts it into a sequence of bytes equal in length to the size of the type, and the *decode* operation takes such a sequence of bytes and optionally converts it into a value. Encoding occurs when a value is written to memory, and decoding occurs when a value is read from memory.
45
+
46
+
> [!NOTE]
47
+
> Only certain byte sequences may decode into a value of a given type. For example, a byte sequence consisting of all zeroes does not decode to a value of a reference type.
48
+
49
+
r[memory.encoding.representation]
50
+
A sequence of bytes is said to represent a value of a type, if the decode operation for that type produces that value from that sequence of bytes. The representation of a type is the partial relation between byte sequences and values those sequences represent.
40
51
41
52
> [!NOTE]
42
53
> Representation is related to, but is not the same property as, the layout of the type.
43
54
55
+
r[memory.encoding.symmetric]
56
+
The result of encoding a given value of a type is a sequence of bytes that represents that value.
57
+
58
+
> [!NOTE]
59
+
> This means that a value can be copied into memory and copied out and the result is the same value.
60
+
> The reverse is not necessarily true, a sequence of bytes read as a value then written to another location (called a typed copy) will not necessarily yield the same sequence of bytes. For example, a typed copy of a struct type will leave the padding bytes of that struct uninitialized.
61
+
44
62
r[memory.encoding.decode]
45
-
If a value of type `T` is decoded from a sequence of bytes that does not correspond to a defined value, the behavior is undefined. If a value of type `T` is decoded from a sequence of bytes that contain pointer fragments, which are not used to represent the value, the pointer fragments are ignored.
63
+
If a value of type `T` is decoded from a sequence of bytes that does not represent any value, the behavior is undefined.
64
+
65
+
> [!NOTE]
66
+
> For example, it is undefined behavior to read a `0x02` byte as `bool`.
0 commit comments