From ccaa840b80f48fe2d89f98b1756b7ebf9dd38887 Mon Sep 17 00:00:00 2001 From: CrLF0710 Date: Fri, 19 Apr 2019 17:16:07 +0800 Subject: [PATCH 1/4] Editorial changes. --- reference/src/layout/pointers.md | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/reference/src/layout/pointers.md b/reference/src/layout/pointers.md index 12ae2423..319f7aa2 100644 --- a/reference/src/layout/pointers.md +++ b/reference/src/layout/pointers.md @@ -2,18 +2,17 @@ ### Terminology -Reference types are types of the form `&T`, `&mut T` or `&dyn T`. +Reference types are types of the form `&T`, `&mut T`. Raw pointer types are types of the form `*const T` or `*mut T`. -We write `*T` when the mutability attribute is unimportant. ### Representation The alignment of `&T`, `&mut T`, `*const T` and `*mut T` are the same, and are at least the word size. -* If `T` is a trait, then the alignment of `&dyn T` is the word size. * If `T` is a sized type then the alignment of `&T` is the word size. +* The alignment of `&dyn Trait` is the word size. * The alignment of `&[T]` is the word size. * The alignment of `&str` is the word size. * Alignment in other cases may be more than the word size (e.g., for other dynamically sized types). @@ -21,15 +20,15 @@ and are at least the word size. The sizes of `&T`, `&mut T`, `*const T` and `*mut T` are the same, and are at least one word. -* If `T` is a trait, then the size of `&dyn T` is two words. * If `T` is a sized type then the size of `&T` is one word. +* The size of `&dyn Trait` is two words. * The size of `&[T]` is two words. * The size of `&str` is two words. * Size in other cases may be more than one word (e.g., for other dynamically sized types). ### Notes -The layouts of `&T`, `&mut T` and `*T` are the same. +The layouts of `&T`, `&mut T`, `*const T` and `*mut T` are the same. If `T` is sized, references and pointers to `T` have a size and alignment of one word and have therefore the same layout as C pointers. @@ -40,23 +39,23 @@ word and have therefore the same layout as C pointers. > or, in the case of `&mut T`, aliasing. We do not make any guarantees about the layout of -multi-trait objects `&(dyn T + U)` or references to other dynamically sized types, +multi-trait objects `&(dyn Tr + Ur)` or references to other dynamically sized types, other than that they are at least word-aligned, and have size at least one word. -The layout of `&dyn T` when `T` is a trait is the same as that of: -```rust,ignore +The layout of `&dyn Trait` when `Trait` is a trait is the same as that of: +```rust #[repr(C)] struct DynObject { - data: *u8, - vtable: *u8, + data: *const u8, + vtable: *const u8, } ``` The layout of `&[T]` is the same as that of: -```rust,ignore +```rust #[repr(C)] struct Slice { - ptr: *T, + ptr: *const T, len: usize, } ``` From 2c76c6b019c02e494ad12984d7b1854c0d4cf644 Mon Sep 17 00:00:00 2001 From: CrLF0710 Date: Fri, 19 Apr 2019 19:41:33 +0800 Subject: [PATCH 2/4] Address review comments. --- reference/src/layout/pointers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference/src/layout/pointers.md b/reference/src/layout/pointers.md index 319f7aa2..7833c308 100644 --- a/reference/src/layout/pointers.md +++ b/reference/src/layout/pointers.md @@ -39,7 +39,7 @@ word and have therefore the same layout as C pointers. > or, in the case of `&mut T`, aliasing. We do not make any guarantees about the layout of -multi-trait objects `&(dyn Tr + Ur)` or references to other dynamically sized types, +multi-trait objects `&(dyn Trait1 + Trait2)` or references to other dynamically sized types, other than that they are at least word-aligned, and have size at least one word. The layout of `&dyn Trait` when `Trait` is a trait is the same as that of: From afb11c3dd9d562d02b9ed6fcebb2335c207f90f7 Mon Sep 17 00:00:00 2001 From: CrLF0710 Date: Mon, 6 May 2019 12:02:08 +0800 Subject: [PATCH 3/4] Address review comment. --- reference/src/layout/pointers.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/reference/src/layout/pointers.md b/reference/src/layout/pointers.md index 7833c308..4aa32388 100644 --- a/reference/src/layout/pointers.md +++ b/reference/src/layout/pointers.md @@ -51,6 +51,8 @@ struct DynObject { } ``` +> **note**: In the layout equivalence of `&dyn mut Trait` the field `data` is of the type `*mut u8`. + The layout of `&[T]` is the same as that of: ```rust #[repr(C)] @@ -60,4 +62,7 @@ struct Slice { } ``` -The layout of `&str` is the same as that of `&[u8]`. +> **note**: In the layout equivalence of `&mut [T]` the field `ptr` is of the type `*mut T`. + +The layout of `&str` is the same as that of `&[u8]`, and the layout of `&mut str` is +the same as that of `&mut [u8]`. From d148b40a271423cec016c54d42565a3cf8d47328 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Mon, 6 May 2019 23:18:53 +0800 Subject: [PATCH 4/4] Apply suggestions from code review Co-Authored-By: crlf0710 --- reference/src/layout/pointers.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reference/src/layout/pointers.md b/reference/src/layout/pointers.md index 4aa32388..336651ef 100644 --- a/reference/src/layout/pointers.md +++ b/reference/src/layout/pointers.md @@ -51,7 +51,7 @@ struct DynObject { } ``` -> **note**: In the layout equivalence of `&dyn mut Trait` the field `data` is of the type `*mut u8`. +> **note**: In the layout of `&dyn mut Trait` the field `data` is of the type `*mut u8`. The layout of `&[T]` is the same as that of: ```rust @@ -62,7 +62,7 @@ struct Slice { } ``` -> **note**: In the layout equivalence of `&mut [T]` the field `ptr` is of the type `*mut T`. +> **note**: In the layout of `&mut [T]` the field `ptr` is of the type `*mut T`. The layout of `&str` is the same as that of `&[u8]`, and the layout of `&mut str` is the same as that of `&mut [u8]`.