将结构体转换为数组是否合法?

2024-02-26

考虑以下:

// Just a sequence of adjacent fields of same the type
#[repr(C)]
#[derive(Debug)]
struct S<T> {
    a : T,
    b : T,
    c : T,
    d : T,
}

impl<T : Sized> S<T> {
    fn new(a : T, b : T, c : T, d : T) -> Self {
        Self {
            a,
            b,
            c,
            d,
        }
    }
    // reinterpret it as an array
    fn as_slice(&self) -> &[T] {
        unsafe { std::slice::from_raw_parts(self as *const Self as *const T, 4) }
    }
}

fn main() {
    let s = S::new(1, 2, 3, 4);
    
    let a = s.as_slice();
    
    println!("s :: {:?}\n\
              a :: {:?}", s, a);
}
  • 这段代码可以移植吗?
  • 假设具有相同类型字段的 repr(C) 结构可以像数组一样重新解释是否总是安全的?为什么?

是的,它是安全且便携的,除了非常大的T(修复如下)。文档安全部分中列出的所有要点均不适用std::slice::from_raw_parts https://doc.rust-lang.org/beta/std/slice/fn.from_raw_parts.html这里有一个问题:

  • 数据指针的有效期为mem::size_of::<T>() * 4,其大小为S<T>,并且已正确对齐。

    • 所有项目都位于同一分配对象中,因为它们位于同一结构中。
    • 指针不为空,因为它是从安全中强制转换的&self参数,并且它已正确对齐,因为S<T>(至少)具有以下对齐方式T.
  • data参数肯定指向4个连续初始化的Ts,因为S被标记#[repr(C)] which 被定义为 https://doc.rust-lang.org/reference/type-layout.html#reprc-structs在您的结构中,不会引入填充。 (repr(Rust)不做出此类保证)。

  • 引用的内存在引用的生命周期内不会发生变化,这是由借用检查器保证的。

  • 切片的总大小不得大于isize::MAX。该代码不会检查这一点,因此从技术上讲这是一个安全漏洞。为了确保安全,请添加一个检查as_slice, 之前unsafe:

    assert!(std::mem::size_of::<S<T>>() <= isize::MAX as _);
    

    该检查通常会被优化掉。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将结构体转换为数组是否合法? 的相关文章

随机推荐

  • 为什么pip找不到pysvn?

    我正在开发一个用 Python 2 编写的项目 并将其升级到 Python 3 到目前为止 我只是发现了一些很容易修复的小语法错误 我所做的就是在 Python 3 中创建一个新项目 确保其正常工作 并将旧项目中的代码块复制到新项目中 现在
  • 为什么 TypeScript 接口不支持索引签名,而类型别名却支持? [复制]

    这个问题在这里已经有答案了 我有一个带有字符串索引签名的类型 declare var result key string number 将接口分配给该类型失败 interface IData a number b number declar
  • 使用 ?attr/selectableItemBackground 作为背景时如何修改波纹颜色?

    我见过一些 SO 问题 他们给出了一些可能的方法来实现我想要的 例如 Use colorControlHighlightstyles xml 中的属性 这是我的 styles v21 xml 还有我的小部件
  • 两个不相等的浮点数相减是否可以得到0?

    在下面的例子中是否可以除以 0 或无穷大 public double calculation double a double b if a b return 0 else return 2 a b 当然 在正常情况下不会 但如果a and
  • 无法在 Ubuntu 中使用 setup.py 中的 Github Actions 安装 Tensorflow 2.2.0rc0

    当我尝试安装时tensorflow gt 2 2 0rc0 from setup py跑步python setup py install从 Github Actions 工作流程中 输出向我发送以下内容 Searching for tens
  • MongoError:不允许用户执行操作

    我使用 MongoDB Atlas 作为我的数据库 我使用 angular4 和环回作为 api 我的应用程序可以正常连接到我的数据库 但是 当我尝试获取数据时 出现此错误 我已将我的 dbname 替换为 dbname MongoErro
  • R/LaTeX 表创建包的建议

    我一直在使用xtable很长一段时间以来 并期待着用 R 编写我的第一个包 所以我认为 如果我有一些值得实施的 酷 想法 那么很有可能有人在我之前到达那里 我对专门用于 LaTeX 表创建的函数 包感兴趣 当然是通过 R 我撞上了quant
  • 如何复制 Google 工作表并保留其项目触发器和脚本?

    我目前有一个 Google 表格 用作主模板 也就是说 我会为每个请求制作该模板的副本 我想向我的主模板添加一个 Google 应用程序脚本 当工作表完成后 它会在编辑时发布到我的服务器 该脚本将被复制并为此模板的每个副本运行 我已经尝试从
  • 是否应该确保 IDisposable.Dispose() 可以安全地多次调用?

    应实施IDisposable make Dispose 多次拨打安全吗 或者相反 大多数 NET Framework 类采用什么方法 具体来说 打电话安全吗 System Data Linq DataContext Dispose 多次 我
  • 建立 iTunes 商店的联属链接而不进行重定向?

    苹果公司在 从 iPhone 应用程序启动 App Store http developer apple com library ios qa qa1629 index html 如何建立一个到应用商店的联属链接并在后台处理重定向 这样就不
  • LLDB GUI 的文档

    我最近一直在研究 LLDB 的 GUI 功能 有关此功能的 stackoverflow 链接有描述here https stackoverflow com questions 19820247 is there a tui mode for
  • MongoDB 3.2 身份验证失败

    我使用以下命令集创建一个用户 这应该在两者中创建用户admin数据库以及我的目标数据库 c2d mongo 127 0 0 1 27017 MongoDB shell version 3 2 6 29 g5c19788 connecting
  • 使用epplus创建.xlsm文件

    我正在尝试让网站导出 xlsm 文件 但似乎找不到任何有帮助的内容 这是我用来测试构建 xlsx 文件 有效 的一个简单示例 using OfficeOpenXml div Change file extension to xlsm to
  • 如何在 PHP 中解析日期字符串?

    日期字符串为Apr 30 2010 我怎样才能将字符串解析为2010 04 30使用 PHP 使用 DateTime API 需要 PHP 5 3 dateTime DateTime createFromFormat F d Y Apr 3
  • 表达请求 .query.xyz 作为字符串 |细绳[]

    我正在尝试为我的变量分配一个类型 该变量从express 请求查询中获取其值 req query 的类型为 QueryString ParsedQs 例如 req query accountId 的类型为 string QueryStrin
  • 是否有一个玩笑配置会导致 console.warn 测试失败?

    如何配置笑话测试以因警告而失败 console warn stuff fail test 您可以使用这个简单的覆盖 let error console error console error function message error a
  • R 的 xtsum 命令?

    我们正在处理面板数据 Stata中有一个命令 xtsum 这给出了数据集中变量的内部方差和方差之间 R 是否有类似的命令可以产生干净的输出 我用了一个小函数来做到这一点 函数 XTSUM 接受三个输入 数据 数据集varname xtsum
  • C# 嵌套 Try Catch 语句或方法?

    简单的最佳实践问题 应该嵌套 try catch 语句还是只使用方法 例如 如果您有一个打开文件的方法确实有效并关闭该文件 那么您将在 try catch 之外进行打开和关闭 或者更确切地说 在 finally 块中进行关闭 现在 如果您的
  • 如何为 'a:before' 和 'a:after' 编写 ':hover' 条件?

    我怎样才能写 hover and visited的条件a before 我想a before hover 但它不起作用 这取决于您实际想要做什么 如果您只是想将样式应用到 before伪元素 当a元素匹配一个伪类 你需要写a hover b
  • 将结构体转换为数组是否合法?

    考虑以下 Just a sequence of adjacent fields of same the type repr C derive Debug struct S