allocate before calling T::default in <Box>::default() · qinheping/verify-rust-std@669e255 (original) (raw)
Navigation Menu
- Explore
- Pricing
Provide feedback
Saved searches
Use saved searches to filter your results more quickly
Commit 669e255
allocate before calling T::default in <Box>::default()
The `Box<T: Default>` impl currently calls `T::default()` before allocating the `Box`. Most `Default` impls are trivial, which should in theory allow LLVM to construct `T: Default` directly in the `Box` allocation when calling `<Box>::default()`. However, the allocation may fail, which necessitates calling `T's` destructor if it has one. If the destructor is non-trivial, then LLVM has a hard time proving that it's sound to elide, which makes it construct `T` on the stack first, and then copy it into the allocation. Create an uninit `Box` first, and then write `T::default` into it, so that LLVM now only needs to prove that the `T::default` can't panic, which should be trivial for most `Default` impls.
File tree
1 file changed
lines changed
1 file changed
lines changed
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1688,7 +1688,7 @@ impl<T: Default> Default for Box { | ||
1688 | 1688 | /// Creates a `Box`, with the `Default` value for T. |
1689 | 1689 | #[inline] |
1690 | 1690 | fn default() -> Self { |
1691 | -Box::new(T::default()) | |
1691 | +Box::write(Box::new_uninit(), T::default()) | |
1692 | 1692 | } |
1693 | 1693 | } |
1694 | 1694 |