在Rust中精确的内存布局控制?

栏目: 编程语言 · Rust · 发布时间: 6年前

内容简介:据我所知,Rust编译器被允许打包,重新排序和添加到结构体的每个字段的填充.如果需要,我如何指定精确的内存布局?在C#中,我有StructLayout属性,在C/C++中,我可以使用各种编译器扩展.我可以通过检查预期值位置的字节偏移来验证内存布局.我想使用自定义着色器编写OpenGL代码,这需要精确的内存布局.有没有办法做到这一点,而不牺牲性能?

据我所知,Rust编译器被允许打包,重新 排序 和添加到结构体的每个字段的填充.如果需要,我如何指定精确的内存布局?

在C#中,我有StructLayout属性,在C/C++中,我可以使用各种编译器扩展.我可以通过检查预期值位置的字节偏移来验证内存布局.

我想使用自定义着色器编写OpenGL代码,这需要精确的内存布局.有没有办法做到这一点,而不牺牲性能?

the FFI guide

所述,您可以向结构体添加属性以使用与C相同的布局:

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

你也可以打包结构体:

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

并且为了检测内存布局是否可以,您可以初始化一个结构体,并通过将指针转换为整数来检查偏移量是否正确:

#[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);
}

输出:

a: 0
b: 1
c: 3

代码日志版权声明:

翻译自:http://stackoverflow.com/questions/26271151/precise-memory-layout-control-in-rust


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Android编程权威指南

Android编程权威指南

[美] Bill Phillips、[美] Brian Hardy / 王明发 / 人民邮电出版社 / 2014-4 / CNY 99.00元

权威、全面、实用、易懂,是本书最大的特色。本书根据美国大名鼎鼎的Big Nerd Ranch训练营的Android培训讲义编写而成,已经为微软、谷歌、Facebook等行业巨头培养了众多专业人才。作者巧妙地把Android开发所需的庞杂知识、行业实践、编程规范等融入一本书中,通过精心编排的应用示例、循序渐进的内容组织,以及循循善诱的语言,深入地讲解了Android开发的方方面面。如果学完一章之后仍......一起来看看 《Android编程权威指南》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换