在 Rust 中设计一个带有 unsafe union 的高效内存布局

程序员咋不秃头2024-05-01 23:56:19  77

这是关于如何构建 CLI 电子表格程序的系列博文中的第一篇博文,主要是因为我厌倦了所有其他电子表格的缺陷。在这篇博文中,我将设计电子表格单元格中每个值的内存布局,因此我们应该从以下问题开始:电子表格单元格包含什么?

A number? Perhaps!

A string of characters? Perhaps!

A formula, which is itself a domain-specific-language? Perhaps!

然而,这还不止于此。我不知道在 Excel 中是否是这种情况,但是在 Google Docs中,一个单元格可以被覆盖它的另一个单元格上显示的矩阵覆盖。矩阵和迭代器将是这个电子表格引擎的核心设计,但这是另一篇博文。不过,这意味着值要么是前面列出的值之一,要么是生成这些值的迭代器。

第一次尝试:动态分发 (dynamic dispatch)

通过枚举分发

十进制数字类型,ft tagged pointers

现在有了联合,也称为 C 的未标记枚举或 Friedrich Transmute。

手动实现 iter dyn

TaggedPtr 的进一步讨论

使用 nolife 解决生命周期问题

该库允许构建包含引用的结构体,并使其与所引用的数据一起存活,而无需生命周期。

这对于零拷贝解析器来说尤其有用,因为零拷贝解析器会借用源数据构建复杂的(可能代价高昂的)表示法。

本库利用 async 函数实现了这一目标。这个库只是提供了一种方法,以可控的方式将引用放到 async 函数之外。

// Given the following types:struct MyData(Vec);struct MyParsedData<'a>(&'a mut MyData, /* ... */);// 1. Define a helper type that will express where the lifetimes of the borrowed representation live.struct MyParsedDataFamily; // empty type, no lifetime.impl<'a> nolife::Family<'a> for MyParsedDataFamily { type Family = MyParsedData<'a>; // Indicates how the type is tied to the trait's lifetime. // you generally want to replace all lifetimes in the struct with the one of the trait.}// 2. Define a function that setups the data and its borrowed representation:fn my_scope( data_source: Vec, // all parameters that allow to build a `MyData`) -> impl nolife::TopScope // use the helper type we declared{ nolife::scope!({ let mut data = MyData(data_source); let mut parsed_data = MyParsedData(&mut data); // imagine that this step is costly... freeze_forever!(&mut parsed_data) // gives access to the parsed data to the outside. /* reference to the borrowed data */ })}// 3. Open a `BoxScope` using the previously written async function:let mut scope = nolife::BoxScope::::new_dyn(my_scope(vec![0, 1, 2]));// 4. Store the `BoxScope` anywhere you wantstruct ContainsScope { scope: nolife::BoxScope, /* other data */}// 5. Lastly, enter the scope to retrieve access to the referenced value.scope.enter(|parsed_data| { /* do what you need with the parsed data */ });

ReadMore: https://github.com/dureuill/nolife

转载此文是出于传递更多信息目的。若来源标注错误或侵犯了您的合法权益,请与本站联系,我们将及时更正、删除、谢谢。
https://www.414w.com/read/398666.html
0
随机主题
大S回应“张兰称孩子退学”:请停止造谣,赔礼道歉雷曼光电4天翻倍, 金瑞矿业有望七连板! 5月22日复盘及翌日计划神光同步 随意调色真正厉害的人 在这方面做得都很“绝”大S拿孩子赌气? 儿子被学校劝退本人不接电话, 汪小菲无奈出面浦江县交通运输综合行政执法队赴浦新矿业公司开展运输专项检查快递站里、电视里、超市小票里都能见到, 为了这件事, 杭州桐庐消防拼了米兰与斯图加特酝酿交易, 卡卢卢西米奇成筹码, 交换28岁德甲银靴美共和党籍议员急喊制裁ICC: 今天是以色列, 下一个就会是我们!听我的劝告: 早入手小米14 Pro的人别轻易看价格, 你会后悔首趟豫鲁“郑日韩”铁海快线班列启程, 助力更多河南制造出海江苏徐州: 1938年7月, 美国人镜头里的鬼子、汉奸和伪军「王阳明」——文成贤圣王阳明,千载光辉照后人#致每一个热爱生活的你同样面对权臣, 孙亮谨小慎微, 曹髦英勇无畏, 谁更值得称道?据阿根廷统计机构, 阿根廷3月经济活动比去年同期下降8.40%和国家队退役冯极内部教学赛实景,对抗性非常高,能力差距有点大欧文: 我时刻提醒队友失败是什么感觉 登顶夺冠又是什么感觉英国政府意外宣布7月大选, 苏纳克目的何在?与预售价一样 2.4T乘用炮、商用炮上市 12.58万元起售9C秘籍 | 让竞争对手认知超越你的10大方法丰田新款“大号凯美瑞”亮相, 氢燃料电池车, 海外售价不菲!
最新回复(0)