1缔恳、每種類型都有一個(gè)數(shù)據(jù)對(duì)齊屬性醉锄。在X86平臺(tái)上u64和f64都是按照32位對(duì)齊的奕坟。
2、一種類型的大小是它對(duì)齊屬性的整數(shù)倍矮湘,這保證了這種類型的值在數(shù)組中的偏移量都是其類型尺寸的整數(shù)倍答恶,可以按照偏移量進(jìn)行索引小作。需要注意的是具则,動(dòng)態(tài)尺寸類型的大小和對(duì)齊可能無(wú)法靜態(tài)獲取。
3啦撮、結(jié)構(gòu)體的對(duì)齊屬性等于它所有成員的對(duì)齊屬性中最大的那個(gè)谭网。Rust會(huì)在必要的位置填充空白數(shù)據(jù),以保證每一個(gè)成員都正確地對(duì)齊赃春,同時(shí)整個(gè)類型的尺寸是對(duì)齊屬性的整數(shù)倍愉择。
例子:
struct A {
a: u8,
b: u32,
c:u16,
}
會(huì)填充為:
struct A {
a: u8,
_pad1: [u8; 3], // 為了對(duì)齊b
b: u32,
c: u16,
_pad2: [u8; 2], // 保證整體類型尺寸是4的倍數(shù)
}
4、注意點(diǎn)织中,兩個(gè)同樣類型的復(fù)合類型其分布規(guī)則并不一定一塵不變锥涕。例子:
struct A {
a: i32,
b: u64,
}
struct B {
a: i32,
b: u64,
}
Rust中不保證A的實(shí)例和B的實(shí)例有同樣的數(shù)據(jù)填充和成員順序。
原因:Rust編譯器會(huì)進(jìn)行優(yōu)化狭吼。如下:
struct Foo<T, U> {
count: u16,
data1: T,
data2: U,
}
對(duì)于上面的泛型結(jié)構(gòu)體层坠,F(xiàn)oo<u32, u16>和Foo<u16, u32>按照內(nèi)存優(yōu)化的原則要求兩者順序不一樣。
5刁笙、求解結(jié)構(gòu)體的大小
使用std::mem破花,有兩種方法,分布是size_of_val和size_of疲吸,例子如下:
use std::mem;
struct A {
a: u8,
b: u16,
}
fn main() {
let aa = A {a: 1, b:2};
println!("size = {}", mem::size_of_val(&aa));
println!("size = {}", mem::size_of::<A>());
println!("Hello, world!");
}