小编lla*_*ram的帖子

编译时通用类型大小检查

我正在尝试为C集合库(Judy Arrays [1])编写Rust绑定,它只为存储指针宽度值提供了空间.我的公司有相当数量的现有代码,它使用这个空间直接存储非指针值,如指针宽度整数和小结构.我希望我的Rust绑定允许使用泛型类型安全地访问此类集合,但是无法使指针存储语义正常工作.

我有一个std::mem::transmute_copy()用于存储值的基本接口,但该函数显式不执行任何操作以确保源和目标类型的大小相同.我能够通过断言验证集合类型参数在运行时是否具有兼容的大小,但我真的希望检查以某种方式在编译时.

示例代码:

pub struct Example<T> {
    v: usize,
    t: PhantomData<T>,
}

impl<T> Example<T> {
    pub fn new() -> Example<T> {
        assert!(mem::size_of::<usize>() == mem::size_of::<T>());
        Example { v: 0, t: PhantomData }
    }

    pub fn insert(&mut self, val: T) {
        unsafe {
            self.v = mem::transmute_copy(&val);
            mem::forget(val);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来做到这一点,或者这个运行时检查最好的Rust 1.0支持?

(相关问题,解释我为什么不使用mem::transmute().)

[1]我知道现有的rust-judy项目,但它并不支持我想要的指针存储,而且我正在编写这些新的绑定,主要是作为一种学习练习.

pointers ffi rust

17
推荐指数
2
解决办法
761
查看次数

numpy是否提供了广义的内在产品?

大多数面向数组的语言,如APL或J都有某种形式的广义内积,它可以像标准矩阵乘法一样,但支持任意运算来代替标准运算.例如,在J中+/ . *是标准乘法 - 然后和,但您也可以例如<./ . +获得add-then-min操作(例如,通过图形逐步更新最短路径的长度).

在慢速和仅2D的Python中,这将是这样的:

import numpy as np

def general_inner(f, g, x, y):
    return np.array([[f(g(x1, y1)) for y1 in y.T] for x1 in x])

x = np.arange(1, 5, dtype="float").reshape((2, 2))
y = np.array([[0.9], [0.1]])
assert(x.dot(y) == general_inner(np.sum, np.multiply, x, y))
Run Code Online (Sandbox Code Playgroud)

是否numpy提供任何直接支持这种模式的东西?

python numpy

8
推荐指数
1
解决办法
236
查看次数

通过`mem :: transmute()`指针存储泛型

我正在尝试为C集合库(Judy Arrays [1])编写Rust绑定,它只为存储指针宽度值提供了空间.我的公司有相当数量的现有代码,它使用这个空间直接存储非指针值,如指针宽度整数和小结构.我希望我的Rust绑定允许使用泛型类型安全地访问此类集合,但是无法使指针存储语义正常工作.

mem::transmute()函数似乎是实现所需行为的一种潜在工具,但尝试在参数化类型的实例上使用它会产生令人困惑的编译错误.

示例代码:

pub struct Example<T> {
    v: usize,
    t: PhantomData<T>,
}

impl<T> Example<T> {
    pub fn new() -> Example<T> {
        Example { v: 0, t: PhantomData }
    }

    pub fn insert(&mut self, val: T) {
        unsafe {
            self.v = mem::transmute(val);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

结果错误:

src/lib.rs:95:22: 95:36 error: cannot transmute to or from a type that contains type parameters in its interior [E0139]
src/lib.rs:95             self.v = mem::transmute(val);
                                   ^~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

这是否意味着只包含参数"在其内部包含类型参数"的类型,因此transmute()在这里不起作用?有正确方法的任何建议吗?

(相关问题,试图获得相同的结果,但不一定通过mem::transmute().) …

pointers ffi rust

5
推荐指数
1
解决办法
448
查看次数

标签 统计

ffi ×2

pointers ×2

rust ×2

numpy ×1

python ×1