小编Loc*_*cke的帖子

JNI对象指针

问题

当尝试使用JNI接口时,我想知道是否可以将a JObject转换为等效的结构以操作字段。但是,当我尝试时,我惊讶地发现这没有用。忽略这个想法可能多么可怕,为什么它不起作用?


我的方法

Java测试类

我做了一个简单的课Point来做我的测试。Point有两个字段和一个接受x和y的构造函数,以及一些根据这些字段返回信息的随机方法。

public class Point {
    public final double x;
    public final double y;
    // As well as some random methods
}
Run Code Online (Sandbox Code Playgroud)

内存布局

使用jol,我Point在java运行时中找到了我的类的结构(如下所示)。

C:\Users\home\IdeaProjects\test-project>java -cp jol-cli-0.9-full.jar;out\production\java-test org.openjdk.jol.Main internals Point
# Running 64-bit HotSpot VM.
# Using compressed oop with 3-bit shift.
# Using compressed klass with 3-bit shift.
# Objects are 8 bytes aligned.
# Field sizes by type: 4, 1, 1, 2, 2, 4, 4, 8, …
Run Code Online (Sandbox Code Playgroud)

java java-native-interface memory-management rust

7
推荐指数
1
解决办法
91
查看次数

在 build.rs 中触发宏扩展

我想使用板条箱cpp创建一个宏,但是该板条箱存在宏扩展问题。

语境

该包的工作原理是获取cpp!{ ... }内联 C 代码的宏,将其内容编译为函数,并用结果函数替换宏调用。这是通过cpp_build::build("src/lib.rs")调用build.rs.

问题

正如板条箱作者所述,cpp!宏是在宏扩展发生之前编译的。这意味着它将尝试按原样解释宏的参数并在宏声明内部进行扩展。

build.rs有没有办法在调用函数之前触发特定宏或文件内部的扩展cpp_build

rust rust-macros

6
推荐指数
1
解决办法
352
查看次数

在Python中比较两个字符串哪种方法更好?我想知道哪个更快

假设两个变量a和b存储两个字符串,我想比较这两个字符串是否相同。在Python中,典型的方式应该是a == b. 我相信时间复杂度是 O(min(m,n)),其中 m 和 n 是字符串的长度。但是如果我以这种方式比较它们 a in {b} (我将字符串 b 添加到集合中并检查字符串 a 是否在该集合中),时间复杂度是否为 O(1),无论 a 和 中的字符串长度如何乙?

python string set

2
推荐指数
1
解决办法
1371
查看次数

创建一个 `Pin<Box<[T; N]>>` 在 Rust 中,当 `[T; N]`太大,无法在堆栈上创建

广义问题

如何pinned_array_of_default在稳定的 Rust 中实现一个[T; N]太大而无法放入堆栈的通用函数?

fn pinned_array_of_default<T: Default, const N: usize>() -> Pin<Box<[T; N]>> {
    unimplemented!()
}
Run Code Online (Sandbox Code Playgroud)

或者,如果这样可以使过程更容易,则T可以实施。Copy

fn pinned_array_of_element<T: Copy, const N: usize>(x: T) -> Pin<Box<[T; N]>> {
    unimplemented!()
}
Run Code Online (Sandbox Code Playgroud)

将解决方案保存在安全的 Rust 中会更好,但似乎不太可能。

方法

最初,我希望通过实现,Default我也许能够Default处理初始分配,但是它仍然在堆栈上创建它,因此这对于较大的 值不起作用N

let boxed: Box<[T; N]> = Box::default();
let foo = Pin::new(boxed);
Run Code Online (Sandbox Code Playgroud)

我怀疑我需要使用它MaybeUninit来实现这一点,并且有一个Box::new_uninit()函数,但它目前不稳定,我理想地希望将其保留在稳定的 Rust 中。我也有点不确定转变为Pin<Box<MaybeUninit<B>>>是否Pin<Box<B>>会对Pin.

背景

使用 a 的目的Pin<Box<[T; N]>>是保存一个指针块,其中 …

allocation rust maybeuninit

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