Skip to content

Commit 4ec33dc

Browse files
authored
Merge pull request #566 from Noratrieb/layout-pages-nuclear
Archive most pages in the reference
2 parents 3fc22e4 + e0a71a2 commit 4ec33dc

File tree

11 files changed

+33
-1525
lines changed

11 files changed

+33
-1525
lines changed
Lines changed: 3 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,7 @@
11
# Layout of Rust array types and slices
22

3-
## Layout of Rust array types
3+
**This page has been archived**
44

5-
Array types, `[T; N]`, store `N` values of type `T` with a _stride_ that is
6-
equal to the size of `T`. Here, _stride_ is the distance between each pair of
7-
consecutive values within the array.
5+
It did not actually reflect current layout guarantees and caused frequent confusion.
86

9-
The _offset_ of the first array element is `0`, that is, a pointer to the array
10-
and a pointer to its first element both point to the same memory address.
11-
12-
The _alignment_ of array types is greater or equal to the alignment of its
13-
element type. If the element type is `repr(C)` the layout of the array is
14-
guaranteed to be the same as the layout of a C array with the same element type.
15-
16-
> **Note**: the type of array arguments in C function signatures, e.g., `void
17-
> foo(T x[N])`, decays to a pointer. That is, these functions do not take arrays
18-
> as an arguments, they take a pointer to the first element of the array
19-
> instead. Array types are therefore _improper C types_ (not C FFI safe) in Rust
20-
> foreign function declarations, e.g., `extern { fn foo(x: [T; N]) -> [U; M];
21-
> }`. Pointers to arrays are fine: `extern { fn foo(x: *const [T; N]) -> *const
22-
> [U; M]; }`, and `struct`s and `union`s containing arrays are also fine.
23-
24-
### Arrays of zero-size
25-
26-
Arrays `[T; N]` have zero size if and only if their count `N` is zero or their
27-
element type `T` is zero-sized.
28-
29-
### Layout compatibility with packed SIMD vectors
30-
31-
The [layout of packed SIMD vector types][Vector] [^2] requires the _size_ and
32-
_alignment_ of the vector elements to match. That is, types with [packed SIMD
33-
vector][Vector] layout are layout compatible with arrays having the same element
34-
type and the same number of elements as the vector.
35-
36-
[^2]: The [packed SIMD vector][Vector] layout is the layout of `repr(simd)` types like [`__m128`].
37-
38-
[Vector]: packed-simd-vectors.md
39-
[`__m128`]: https://doc.rust-lang.org/core/arch/x86_64/struct.__m128.html
40-
41-
## Layout of Rust slices
42-
43-
The layout of a slice `[T]` of length `N` is the same as that of a `[T; N]` array.
7+
The old content can be accessed [on GitHub](https://github.com/rust-lang/unsafe-code-guidelines/blob/c138499c1de03b908dfe719a41193c84f8146883/reference/src/layout/arrays-and-slices.md).

0 commit comments

Comments
 (0)