2014-10-09 22 views
17

olarak bildiğim kadarıyla, Pas derleyici, paketi yeniden düzenlemek ve yapının her alan için doldurma eklemek için izin verilir. İhtiyacım olduğunda hassas bellek düzenini nasıl belirleyebilirim? C# ' Rust Hassas bellek düzeni kontrolü?

, ben StructLayout özniteliği ve C/C++, ben çeşitli derleyici uzantıları kullanabilirsiniz. Beklenen değer konumlarının bayt ofsetini kontrol ederek bellek düzenini doğrulayabilirim.

ben kesin hafıza düzeni ihtiyacı özel shader'lar istihdam OpenGL kodu yazmak istiyorum. Performanstan ödün vermeden bunu yapmanın bir yolu var mı?

the FFI guide açıklandığı üzere

cevap

22

, C aynı düzeni kullanmak yapılar için özellik ekleyebilirsiniz:

#[repr(C)] 
struct Object { 
    a: i32, 
    // other members 
} 

ve ayrıca yapı paketi yeteneğine sahip:

#[repr(C, packed)] 
struct Object { 
    a: i32, 
    // other members 
} 

Ve için bellek düzeni yeterli olduğunu tespit, bir yapı başlatabilir ve tamsayılar için işaretçiler döküm yoluyla uzaklıklar Tamam olup olmadığını kontrol edin:

#[repr(C, packed)] 
struct Object { 
    a: u8, 
    b: u16, 
    c: u32, // other members 
} 

fn main() { 
    let obj = Object { 
     a: 0xaa, 
     b: 0xbbbb, 
     c: 0xcccccccc, 
    }; 
    let a_ptr: *const u8 = &obj.a; 
    let b_ptr: *const u16 = &obj.b; 
    let c_ptr: *const u32 = &obj.c; 

    let base = a_ptr as usize; 

    println!("a: {}", a_ptr as usize - base); 
    println!("b: {}", b_ptr as usize - base); 
    println!("c: {}", c_ptr as usize - base); 
} 

çıkışlar: to_uint artık yoktur

a: 0 
b: 1 
c: 3 
4

bu. Rust 1.0, kod olabilir:

#[repr(C, packed)] 
struct Object { 
    a: i8, 
    b: i16, 
    c: i32, // other members 
} 

fn main() { 
    let obj = Object { 
     a: 0x1a, 
     b: 0x1bbb, 
     c: 0x1ccccccc, 
    }; 

    let base = &obj as *const _ as usize; 
    let a_off = &obj.a as *const _ as usize - base; 
    let b_off = &obj.b as *const _ as usize - base; 
    let c_off = &obj.c as *const _ as usize - base; 

    println!("a: {}", a_off); 
    println!("b: {}", b_off); 
    println!("c: {}", c_off); 
}