@@ -25,13 +25,15 @@ appropriate page on our website, and check out the [detailed release notes for
25
25
26
26
### Global Allocators
27
27
28
- 1.28.0 adds the ` #[global_allocator] ` attribute, which allows Rust programs to
29
- set their allocator, as well as define new allocators by implementing the
30
- [ ` GlobalAlloc ` ] trait.
28
+ Allocators are the way that programs in Rust obtain memory from the system at
29
+ runtime. Previously, Rust did not allow changing the way memory is obtained,
30
+ which prevented some use cases. With 1.28.0, the ` #[global_allocator] ` attribute
31
+ is now stable, which allows Rust programs to set their allocator to the system
32
+ allocator, as well as define new allocators by implementing the [ ` GlobalAlloc ` ]
33
+ trait.
31
34
32
- By default, Rust uses jemalloc on Linux systems, but this may not be ideal for
33
- specific use cases. The standard library provides a method for switching to the
34
- system allocator:
35
+ The standard library provides a handle to the system allocator, which can be
36
+ used as such:
35
37
36
38
``` rust
37
39
use std :: alloc :: System ;
@@ -50,74 +52,57 @@ However, sometimes you want to define a custom allocator for a given application
50
52
domain. This is also relatively easy to do by implementing the ` GlobalAlloc `
51
53
trait. You can read more about how to do this in the [ documentation] .
52
54
53
- [ `GlobalAlloc` ] : https://doc.rust-lang.org/1.28.0 /std/alloc/trait.GlobalAlloc.html
54
- [ documentation ] : https://doc.rust-lang.org/1.28.0 /std/alloc/trait.GlobalAlloc.html
55
+ [ `GlobalAlloc` ] : https://doc.rust-lang.org/stable /std/alloc/trait.GlobalAlloc.html
56
+ [ documentation ] : https://doc.rust-lang.org/stable /std/alloc/trait.GlobalAlloc.html
55
57
56
- ### Library stabilizations
58
+ ### Improved error message for formatting
59
+
60
+ Work on diagnostics continues, this time with an emphasis on formatting:
61
+
62
+ ``` rust
63
+ format! (" {_foo}" , _foo = 6usize );
64
+ ```
65
+
66
+ Previously, the error message emitted here was relatively poor:
67
+
68
+ ```
69
+ error: invalid format string: expected `'}'`, found `'_'`
70
+ |
71
+ 2 | format!("{_foo}", _foo = 6usize);
72
+ | ^^^^^^^^
73
+ ```
57
74
58
- Several new APIs were stabilized this release:
59
-
60
- - [ ` Iterator::step_by ` ]
61
- - [ ` Path::ancestors ` ]
62
- - [ ` SystemTime::UNIX_EPOCH ` ]
63
- - [ ` alloc::GlobalAlloc ` ]
64
- - [ ` alloc::Layout ` ]
65
- - [ ` alloc::LayoutErr ` ]
66
- - [ ` alloc::System ` ]
67
- - [ ` alloc::alloc ` ]
68
- - [ ` alloc::alloc_zeroed ` ]
69
- - [ ` alloc::dealloc ` ]
70
- - [ ` alloc::realloc ` ]
71
- - [ ` alloc::handle_alloc_error ` ]
72
- - [ ` btree_map::Entry::or_default ` ]
73
- - [ ` fmt::Alignment ` ]
74
- - [ ` hash_map::Entry::or_default ` ]
75
- - [ ` iter::repeat_with ` ]
76
- - [ ` num::NonZeroUsize ` ]
77
- - [ ` num::NonZeroU128 ` ]
78
- - [ ` num::NonZeroU16 ` ]
79
- - [ ` num::NonZeroU32 ` ]
80
- - [ ` num::NonZeroU64 ` ]
81
- - [ ` num::NonZeroU8 ` ]
82
- - [ ` ops::RangeBounds ` ]
83
- - [ ` slice::SliceIndex ` ]
84
- - [ ` slice::from_mut ` ]
85
- - [ ` slice::from_ref ` ]
86
- - [ ` {Any + Send + Sync}::downcast_mut ` ]
87
- - [ ` {Any + Send + Sync}::downcast_ref ` ]
88
- - [ ` {Any + Send + Sync}::is ` ]
75
+ Now, we emit a diagnostic that tells you the specific reason the format string
76
+ is invalid:
77
+
78
+ ```
79
+ error: invalid format string: invalid argument name `_foo`
80
+ |
81
+ 2 | let _ = format!("{_foo}", _foo = 6usize);
82
+ | ^^^^ invalid argument name in format string
83
+ |
84
+ = note: argument names cannot start with an underscore
85
+ ```
89
86
90
87
See the [ detailed release notes] [ notes ] for more.
91
88
92
- [ `Iterator::step_by` ] : https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.step_by
93
- [ `Path::ancestors` ] : https://doc.rust-lang.org/std/path/struct.Path.html#method.ancestors
94
- [ `SystemTime::UNIX_EPOCH` ] : https://doc.rust-lang.org/std/time/struct.SystemTime.html#associatedconstant.UNIX_EPOCH
95
- [ `alloc::GlobalAlloc` ] : https://doc.rust-lang.org/std/alloc/trait.GlobalAlloc.html
96
- [ `alloc::Layout` ] : https://doc.rust-lang.org/std/alloc/struct.Layout.html
97
- [ `alloc::LayoutErr` ] : https://doc.rust-lang.org/std/alloc/struct.LayoutErr.html
98
- [ `alloc::System` ] : https://doc.rust-lang.org/std/alloc/struct.System.html
99
- [ `alloc::alloc` ] : https://doc.rust-lang.org/std/alloc/fn.alloc.html
100
- [ `alloc::alloc_zeroed` ] : https://doc.rust-lang.org/std/alloc/fn.alloc_zeroed.html
101
- [ `alloc::dealloc` ] : https://doc.rust-lang.org/std/alloc/fn.dealloc.html
102
- [ `alloc::realloc` ] : https://doc.rust-lang.org/std/alloc/fn.realloc.html
103
- [ `alloc::handle_alloc_error` ] : https://doc.rust-lang.org/std/alloc/fn.handle_alloc_error.html
104
- [ `btree_map::Entry::or_default` ] : https://doc.rust-lang.org/std/collections/btree_map/enum.Entry.html#method.or_default
105
- [ `fmt::Alignment` ] : https://doc.rust-lang.org/std/fmt/enum.Alignment.html
106
- [ `hash_map::Entry::or_default` ] : https://doc.rust-lang.org/std/collections/btree_map/enum.Entry.html#method.or_default
107
- [ `iter::repeat_with` ] : https://doc.rust-lang.org/std/iter/fn.repeat_with.html
108
- [ `num::NonZeroUsize` ] : https://doc.rust-lang.org/std/num/struct.NonZeroUsize.html
109
- [ `num::NonZeroU128` ] : https://doc.rust-lang.org/std/num/struct.NonZeroU128.html
110
- [ `num::NonZeroU16` ] : https://doc.rust-lang.org/std/num/struct.NonZeroU16.html
111
- [ `num::NonZeroU32` ] : https://doc.rust-lang.org/std/num/struct.NonZeroU32.html
112
- [ `num::NonZeroU64` ] : https://doc.rust-lang.org/std/num/struct.NonZeroU64.html
113
- [ `num::NonZeroU8` ] : https://doc.rust-lang.org/std/num/struct.NonZeroU8.html
114
- [ `ops::RangeBounds` ] : https://doc.rust-lang.org/std/ops/trait.RangeBounds.html
115
- [ `slice::SliceIndex` ] : https://doc.rust-lang.org/std/slice/trait.SliceIndex.html
116
- [ `slice::from_mut` ] : https://doc.rust-lang.org/std/slice/fn.from_mut.html
117
- [ `slice::from_ref` ] : https://doc.rust-lang.org/std/slice/fn.from_ref.html
118
- [ `{Any + Send + Sync}::downcast_mut` ] : https://doc.rust-lang.org/std/any/trait.Any.html#method.downcast_mut-2
119
- [ `{Any + Send + Sync}::downcast_ref` ] : https://doc.rust-lang.org/std/any/trait.Any.html#method.downcast_ref-2
120
- [ `{Any + Send + Sync}::is` ] : https://doc.rust-lang.org/std/any/trait.Any.html#method.is-2
89
+ ### Library stabilizations
90
+
91
+ We've already mentioned the stabilization of the ` GlobalAlloc ` trait, but
92
+ another important stabilization is the [ ` NonZero ` ] types. These are wrappers
93
+ around the standard unsigned integer types: ` u8 ` , ` u16, ` u32` , ` u64` , ` u128`,
94
+ and ` usize ` .
95
+
96
+ This allows for size-optimization, for example, ` Option<u8> ` is two bytes large,
97
+ but ` Option<NonZeroU8> ` is just one byte large. This is especially useful when
98
+ the number represents an identifier and so you can guarantee that it is never
99
+ going to be zero, reducing the size of optional identifiers at no visible cost
100
+ to them.
101
+
102
+ A number of other libraries have also been stabilized: you can see the more
103
+ [ detailed release notes] [ notes ] for full details.
104
+
105
+ [ `NonZero` ] : https://doc.rust-lang.org/stable/std/num/index.html
121
106
122
107
### Cargo features
123
108
0 commit comments