c# - 在 C# 中的等效结构之间有效转换
问题描述
我在两个使用等效结构的库之间进行通信。例如:
struct MyVector {
public float x, y, z;
}
struct TheirVector {
public float x, y, z;
}
目前,我通过将每个成员复制到另一个成员的实例中来在这些类型之间“转换”。知道 C# 如何将结构存储在内存中,难道没有更有效的方法来使用指针吗?
此外,假设我有两个这些等效结构的数组:
MyVector[] array1; // (Length 1000)
TheirVector[] array2; // (Length 1000)
没有办法将整个内存块从array1复制到array2吗?或者更好的是,我可以将整个 array1 视为 array2 类型而不在内存中创建副本吗?
我确定答案需要指针,但我只在 C++ 中使用过指针,不知道 C# 如何实现它们。
有没有人有任何关于如何实现这样的目标的例子?
提前致谢!
解决方案
是的,如果您绝对 100% 确定它们具有相同的内存布局,则可以在它们之间进行强制转换。这样做的首选方法(避免太多unsafe
/ 指针)是:spans。例如:
var theirs = MemoryMarshal.Cast<MyVector, TheirVector>(array1);
这给出theirs
了一个Span<TheirVector>
,而不复制任何实际数据。Spans 具有与数组/向量非常相似的 API,因此您希望工作的大多数事情:应该完全按照您的预期工作。您只需使用不同类型对同一内存进行类型化引用。
推荐阅读
- sql - sql号登录并创建sql查询
- javascript - 基于浏览器的会话计时器
- android - 我的 Android Webview 上 iframe 上的 PHP 表单有问题
- python - 有没有一种方法可以只从矩阵中的每一行和每一列中获取所需的索引范围的元素?
- javascript - 外部 Javascript 变量的 HTML 表单输入
- python - 如何在 python 3.7 中使用正则表达式来拥有 2 个或 3 个组?
- ruby-on-rails - Rails:是否可以自动调整独角兽工作进程的数量?
- sql - 根据用户输入转换 oracle 日期格式
- javascript - 如何遍历对象数组并计算存在多少重复值?
- java - 如何创建 EditText 和 Button 以便 EditText 应该在按下按钮存储 prev 值时接受新输入?